1

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

 ,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
4

2 回答 2

2

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

X据说条件于条件YifX暗示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 也将得到满足,因为条件 1AND加上了一些附加条件来形成条件 2。因此,条件 2 比条件 1 强。

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

于 2013-08-01T11:10:13.597 回答
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
 )
于 2013-08-01T11:23:28.830 回答