【问题标题】:Nested Case Then in SQL嵌套案例 Then 在 SQL 中
【发布时间】:2016-04-06 03:05:21
【问题描述】:

我正在尝试执行以下涉及复杂查询的操作; 1.首先我尝试根据一些逻辑选择列 2.然后根据所选列的值选择一个值 3. finally 基于之前的值,应用一个逻辑得到最终值

如何在 3rd Case..Then 语句的 ELSE 中获得 2 的结果?

CASE 
    CASE 
        CASE 
            WHEN MDC.Network ='I' THEN INNBenefitID ELSE OONBenefitID 
        END
        WHEN 'INNDWO' THEN CASE WHEN DWO.Description IS NOT NULL THEN DWO.Description ELSE MDC.CostShareValue END 
        WHEN 'OONDWO' THEN CASE WHEN DWO.Description IS NOT NULL THEN DWO.Description ELSE MDC.CostShareValue END 
        ELSE isnull(dbo.fn_FormatText(MDC.CostShareValue, CostShareType),'''') 
    END
    WHEN '0%' THEN 'Covered 100%'
    WHEN '$0' THEN 'Covered 100%' 
    ELSE ????
   END

【问题讨论】:

  • 案例表达式,而不是案例陈述......
  • 请解释您想要的逻辑并提供示例。
  • 可能,CROSS APPLY 是你的朋友...
  • 这是在 Select 语句中,我必须根据列值有条件地选择一列以设置一些逻辑,然后对返回的值进行一些字符串转换。只是我想在外部 Case 表达式的 Else 中返回内部 Case..when 的值。

标签: sql sql-server


【解决方案1】:

您是否正在寻找类似的东西? :

declare @value varchar(255) = (
                     CASE 
                     WHEN MDC.Network ='I' THEN INNBenefitID ELSE OONBenefitID 
                     WHEN 'INNDWO' THEN CASE WHEN DWO.Description IS NOT NULL THEN DWO.Description ELSE MDC.CostShareValue
                     WHEN 'OONDWO' THEN CASE WHEN DWO.Description IS NOT NULL THEN DWO.Description ELSE MDC.CostShareValue
                     ELSE isnull(dbo.fn_FormatText(MDC.CostShareValue, CostShareType),'''') 
                     END
                   ) 

CASE 
   WHEN '0%' THEN 'Covered 100%'
   WHEN '$0' THEN 'Covered 100%' 
   ELSE @value
END

【讨论】:

  • 我不能这样做,因为这个块在 select 语句中
【解决方案2】:

如果没有架构或示例数据,真的很难做到这一点。将来考虑为我们创建一个 SqlFiddle。但您可能考虑的一种方法是使用公用表表达式 (CTE) 来定义一个中间结构,然后再进行查询。

;WITH theCTE AS (SELECT 
    CASE 
        CASE 
            WHEN MDC.Network ='I' THEN INNBenefitID ELSE OONBenefitID 
        END
        WHEN 'INNDWO' THEN COALESCE(DWO.Description, MDC.CostShareValue)
        WHEN 'OONDWO' THEN COALESCE(DWO.Description, MDC.CostShareValue)
        ELSE COALESCE(dbo.fn_FormatText(MDC.CostShareValue, CostShareType), '') 
    END AS foo
FROM 
    bar
)

SELECT 
    CASE  
        WHEN foo IN ('0%', '$0') THEN 'Covered 100%'
        ELSE '' -- Do something with foo --
    END AS finalColumn
FROM 
    theCTE 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多