CASE声明有多种结果 - 忽略了一些结果

时间:2013-08-01 10:58:23

标签: sql tsql case

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

 ,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

2 个答案:

答案 0 :(得分:2)

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

如果X暗示Y,则条件X被称为更强而不是条件Y。换句话说,每当Y为真时,X都为真。

例如,考虑两个条件:

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 - 用一些额外的标准来形成条件2.因此,条件2强于条件1。

如果您的案例陈述具有与您相同的非互斥条件,则需要从最强到最弱的顺序进行排序。否则,你的弱势条件会“遮蔽”强者,永远不会让他们执行。

答案 1 :(得分:1)

您可以将案例表达解析为一组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
 )