2016-09-08 14 views
2

我正在使用SQL Server 2014,並且在T-SQL查詢中有以下CASE語句。如何將CASE語句轉換爲T-SQL中的用戶定義函數

(CASE   
    WHEN c.[Market FINAL] = 'Overbooking' AND c.[Booking type] = 'GRP' THEN 'Overbooking' 
    WHEN c.[TaProfileID] = 853 THEN 'Poland (TUI only)' 
    WHEN c.[Source of Business] = 'TO' AND c.[CountryName] = 'Netherlands' THEN 'Netherlands' 
    WHEN c.[Source of Business] = 'DMC' AND c.[Booking Origin (1)] = 'Netherlands' THEN 'Netherlands' 
    WHEN c.[Booking type] = 'GRP' THEN 'G&I' 
    ELSE c.[Market FINAL] 
END) AS 'Market', 

我想將其從此查詢中刪除並作爲用戶定義的函數運行它,但我很難創建函數。另外,一旦它作爲函數運行,我將如何在查詢中使用它?

+0

您也可以使用'CROSS APPLY'和產生可以被查詢的其餘部分被消耗掉很多次計算的字段。 –

+0

我會添加一個翻譯表而不是 –

+0

@ZoharPeled謝謝。你可以在SQL中提供翻譯表的一些參考資料嗎?谷歌沒有多大幫助。 – user3115933

回答

0
 

    CREATE FUNCTION [dbo].[_fnMyCase] (@Filter1 AS VARCHAR(20) 
            , @Filter2 AS VARCHAR(20))  
    RETURNS VARCHAR(20) 
    AS 
    BEGIN 

     DECLARE @MyReturn AS VARCHAR(20) = '' 

     SELECT @MyReturn = 
       (CASE   
        WHEN c.[Market FINAL] = 'Overbooking' 
         AND c.[Booking type] = 'GRP' 
         THEN 'Overbooking' 
        WHEN c.[TaProfileID] = 853 
         THEN 'Poland (TUI only)' 
        WHEN c.[Source of Business] = 'TO' 
         AND c.[CountryName] = 'Netherlands' 
         THEN 'Netherlands' 
        WHEN c.[Source of Business] = 'DMC' 
         AND c.[Booking Origin (1)] = 'Netherlands' 
         THEN 'Netherlands' 
        WHEN c.[Booking type] = 'GRP' 
         THEN 'G&I' 
        ELSE c.[Market FINAL] 
       END) 
     FROM c 
     WHERE Filter1 = @Filter1 AND Filter2 = @Filter2 

     RETURN @MyReturn   

    END 

+0

什麼是Filter1和Filter2? – user3115933

0

這個邏輯看起來像設計缺陷。然而,由於所有列在同一個表,我建議計算列:

CREATE TABLE SomeTable 
(
    [Market Final] varchar(20), 
    [Booking type] varchar(10), 
    TaProfileId int, 
    [Source of Business] varchar(10), 
    [CountryName] varchar(20), 
    [Booking Origin (1)] varchar(10), 
--Other fields 
    Market AS 
     CASE   
      WHEN [Market FINAL] = 'Overbooking' AND [Booking type] = 'GRP' THEN 'Overbooking' 
      WHEN [TaProfileID] = 853 THEN 'Poland (TUI only)' 
      WHEN [Source of Business] = 'TO' AND [CountryName] = 'Netherlands' THEN 'Netherlands' 
      WHEN [Source of Business] = 'DMC' AND [Booking Origin (1)] = 'Netherlands' THEN 'Netherlands' 
      WHEN [Booking type] = 'GRP' THEN 'G&I' 
      ELSE [Market FINAL] 
     END 
) 

然後,而不是你的複雜的表情,你可以使用:

SELECT c.Market, ... 
FROM SomeTable c 
0

你應該創造這樣的一個功能下面。

CREATE FUNCTION [dbo].[fnMyCase] (
    @MarketFINAL VARCHAR(50) 
    ,@Bookingtype VARCHAR(50) 
    ,@TaProfileID INT 
    ,@SourceofBusiness VARCHAR(50) 
    ,@CountryName VARCHAR(50) 
    ,@BookingOrigin VARCHAR(50) 
    ) 
RETURNS VARCHAR(20) 
AS 
BEGIN 
    DECLARE @MyReturn AS VARCHAR(50) = '' 

    SELECT @MyReturn = (
      CASE 
       WHEN @MarketFINAL = 'Overbooking' 
        AND @Bookingtype = 'GRP' 
        THEN 'Overbooking' 
       WHEN @TaProfileID = 853 
        THEN 'Poland (TUI only)' 
       WHEN @SourceofBusiness = 'TO' 
        AND @CountryName = 'Netherlands' 
        THEN 'Netherlands' 
       WHEN @SourceofBusiness = 'DMC' 
        AND @BookingOrigin = 'Netherlands' 
        THEN 'Netherlands' 
       WHEN @Bookingtype = 'GRP' 
        THEN 'G&I' 
       ELSE @MarketFINAL 
       END 
      ) 

    RETURN @MyReturn 
END 

調用函數這個樣子,

SELECT * 
    ,[dbo].[fnMyCase](c.[Market FINAL], c.[Booking type], c.[TaProfileID], c.[Source of Business], c.[CountryName], c.[Booking Origin (1)]) AS Market 
FROM c