2016-09-08 16 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