2013-08-01 45 views
1

我有一個病例陳述,例如下面的陳述中有多個結果。不幸的是,由於前三項成果得到滿足,其他選項被忽略。有沒有考慮到所有結果的說法?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 
+1

請添加示例數據和預期的輸出。 –

+1

更改'when..then'從句的順序,讓更復雜的句子先到達。 –

+1

只要第一個CASE得到滿足,其他人就不會被檢查。記住這一點並重新設計您的查詢。要麼改變條款的順序 - 要麼在CASE中使用CASE。 –

回答

2

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更強。

當您有一個非共同的案例陳述像你的獨家條件,你需要從最強到最弱。否則,你較弱的條件會「影響」較強的條件,從不讓它們執行。

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 
)