【问题标题】:CASE Statement with multiple outcomes - some outcomes overlooked具有多个结果的 CASE 声明 - 一些结果被忽略
【发布时间】:2013-08-01 10:58:22
【问题描述】:

我有一个案例陈述,例如下面的案例陈述,它有多个结果。不幸的是,由于前三个结果得到满足,其他选项被忽略了。有没有考虑到所有结果的陈述方式?

 ,CASE WHEN T.T1_HoNOSCA_Score IS NULL THEN 'Missing T1'
    WHEN T.T2_HoNOSCA_Score IS NULL THEN 'Missing T2'
    WHEN T.T1HonosValidity IN ('NULL','Invalid 9','Invalid Null') 
    OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null') THEN 'Invalid Data'
    WHEN T.T1_HoNOSCA_Score IS NULL AND T.T2_HoNOSCA_Score IS NULL THEN 'Missing T1 & T2'   
    WHEN T.T1_HoNOSCA_Score IS NULL AND T.T1HonosValidity IN ('NULL','Invalid 9','Invalid    `enter code here`Null') 
    OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null') THEN 'Missing T1 & Invalid Data'
    WHEN T.T2_HoNOSCA_Score IS NULL AND T.T1HonosValidity IN ('NULL','Invalid 9','Invalid Null') 
    OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null') THEN 'Missing T2 & Invalid Data'
    WHEN T.T1_HoNOSCA_Score IS NULL AND T.T2_HoNOSCA_Score IS NULL AND T.T1HonosValidity IN ('NULL','Invalid 9','Invalid Null') 
    OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null') THEN 'Missing T1 & T2 & Invalid Data'
    ELSE NULL END AS Data_Quality_Type

【问题讨论】:

  • 请添加示例数据和预期输出。
  • 更改when..then 子句的顺序,让更复杂的子句先出现。
  • 只要第一个 CASE 满足,其他的甚至都不检查。请记住这一点并重新设计您的查询。更改子句的顺序 - 或 - 在 CASE 中使用 CASE。

标签: sql tsql case


【解决方案1】:

您的CASE 语句包含不互斥的布尔表达式。其中一些表达方式比其他表达方式更强。

如果X 暗示Y,则称条件X 比条件Y更强。换句话说,每次X 为真时,Y 都为真。

例如,考虑两个条件:

T.T2_HoNOSCA_Score IS NULL                                -- Condition 1

T.T1_HoNOSCA_Score IS NULL AND T.T2_HoNOSCA_Score IS NULL -- Condition 2

每次满足条件 2 时,条件 1 也会满足,因为条件 1 是 AND-ed 加上一些额外的条件来形成条件 2。因此,条件 2 比条件 1 更强。

当您的 case 语句具有像您这样的非互斥条件时,您需要将它们从最强到最弱排序。否则,您较弱的条件会“遮蔽”较强的条件,永远不会让它们执行。

【讨论】:

    【解决方案2】:

    您可以将案例表达式分解为一组 3 个单独的测试,并根据需要加入结果。

    该示例以 oracle 语法提供。但是,您的 dbms 将提供类似的字符串格式化功能,否则请选择功能等效但可读性较差的纯 sql 版本。

    , RTRIM (
         RTRIM (
             SUBSTR(
                    CASE WHEN T.T1_HoNOSCA_Score IS NULL THEN ' Missing T1 &'   ELSE '' END
                 || CASE WHEN T.T2_HoNOSCA_Score IS NULL THEN ' Missing T2 &'   ELSE '' END
                 || CASE WHEN    T.T1_HonosValidity IN ('NULL','Invalid 9','Invalid Null')
                              OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null')
                                                         THEN ' Invalid Data &' ELSE '' END
               , 2
             )
           , '&'
         )
      )
    

    sql:

     SUBSTR(
            CASE WHEN T.T1_HoNOSCA_Score IS NULL THEN ' Missing T1 &'   ELSE '' END
         || CASE WHEN T.T2_HoNOSCA_Score IS NULL THEN ' Missing T2 &'   ELSE '' END
         || CASE WHEN    T.T1_HonosValidity IN ('NULL','Invalid 9','Invalid Null')
                      OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null')
                                                 THEN ' Invalid Data &' ELSE '' END
       , 2
       , LENGTH (
                CASE WHEN T.T1_HoNOSCA_Score IS NULL THEN ' Missing T1 &'   ELSE '' END
             || CASE WHEN T.T2_HoNOSCA_Score IS NULL THEN ' Missing T2 &'   ELSE '' END
             || CASE WHEN    T.T1_HonosValidity IN ('NULL','Invalid 9','Invalid Null')
                          OR T.T2_HonosValidity IN ('NULL','Invalid 9','Invalid Null')
                                                     THEN ' Invalid Data &' ELSE '' END
         ) - 3
     )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多