【问题标题】:How to convert a CASE Statement into a User-defined Function in T-SQL如何在 T-SQL 中将 CASE 语句转换为用户定义的函数
【发布时间】:2017-01-15 22:29:56
【问题描述】:

我正在使用 SQL Server 2014,并且在 T-SQL 查询中有以下 CASE 语句。

(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',

我想从该查询中删除它并将其作为用户定义的函数运行,但我很难创建该函数。另外,一旦它作为函数运行,我将如何在查询中使用它?

【问题讨论】:

  • 您也可以使用CROSS APPLY 并生成一个计算字段,该字段可以被其余查询多次使用。
  • 我会添加一个翻译表
  • @ZoharPeled 谢谢。能否提供一些关于 SQL 中翻译表的参考资料? Google 帮不上什么忙。
  • 完整的查询是什么样的?
  • 只是一个简单的表,其中包含决定案例语句结果所需的列,以及该结果的列。

标签: sql sql-server tsql case user-defined-functions


【解决方案1】:

您应该创建如下所示的函数。

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

【讨论】:

    【解决方案2】:

    这个逻辑看起来像是设计缺陷。但是,由于所有列都在同一个表中,我建议计算列:

    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
    

    【讨论】:

      【解决方案3】:
      创建函数 [dbo].[_fnMyCase] (@Filter1 AS VARCHAR(20) , @Filter2 作为 VARCHAR(20)) 返回 VARCHAR(20) 作为 开始 声明 @MyReturn 为 VARCHAR(20) = '' 选择@MyReturn = (案子 当 c.[市场最终] = '超额预订' 和 c.[预订类型] = 'GRP' 然后“超额预订” 当 c.[TaProfileID] = 853 THEN '波兰(仅限 TUI)' 何时 c.[业务来源] = 'TO' 和 c.[CountryName] = '荷兰' 然后是“荷兰” 何时 c.[业务来源] = 'DMC' 和 c.[预订来源 (1)] = '荷兰' 然后是“荷兰” 何时 c.[预订类型] = 'GRP' 然后'G&I' ELSE c.[市场决赛] 结尾) 从 c 其中 Filter1 = @Filter1 AND Filter2 = @Filter2 返回@MyReturn 结尾

      【讨论】:

      • 什么是Filter1和Filter2?
      猜你喜欢
      • 2018-11-12
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多