2011-08-09 175 views
2

過濾NULL值我有以下查詢:在CASE語句

select 
    CASE WHEN rt.ROLE_TYPE_CD = 'SA' THEN ap.APPL_CD + ' ' + rt.ROLE_TYPE_CD 
     WHEN ap.APPL_SID = 1 THEN rt.ROLE_TYPE_CD 
     ELSE NULL 
     END as dropdownName, 
    rt.role_type_sid as dropdownID, 
    rt.actv_ind as active, 
    'Application Role' as dropdownCatagory   
from cdms_role_type rt 
INNER JOIN CDMS_APPLICATION ap 
ON rt.APPL_SID = ap.APPL_SID 
where role_type_cd != 'All Role Types' 
**AND (CASE WHEN rt.ROLE_TYPE_CD = 'SA' THEN ap.APPL_CD + ' ' + rt.ROLE_TYPE_CD 
     WHEN ap.APPL_SID = 1 THEN rt.ROLE_TYPE_CD END) IS NOT NULL** 

我想避免的最後一個AND條件,仍然想擺脫NULL值的下拉column.How我去嗎?請幫助

回答

2

僅過濾出的記錄,將產生一個非空值:

select 
    CASE WHEN rt.ROLE_TYPE_CD = 'SA' THEN ap.APPL_CD + ' ' + rt.ROLE_TYPE_CD 
     ELSE rt.ROLE_TYPE_CD 
     END as dropdownName, 
    rt.role_type_sid as dropdownID, 
    rt.actv_ind as active, 
    'Application Role' as dropdownCatagory   
from cdms_role_type rt 
INNER JOIN CDMS_APPLICATION ap 
ON rt.APPL_SID = ap.APPL_SID 
where role_type_cd != 'All Role Types' 
    and (rt.ROLE_TYPE_CD = 'SA' or ap.APPL_SID = 1) 
2

一個CASE不匹配任何WHEN條款是NULL,因此就使用這一事實把你的代碼放到一個簡單的匹配:

... 
where role_type_cd != 'All Role Types' 
AND (rt.ROLE_TYPE_CD = 'SA' OR ap.APPL_SID = 1) 

有沒有辦法避免的最後AND,但它很簡單 - 我不知道你爲什麼要避免這樣的事情。

注意:使用OR時,請確保使用括號。因爲AND優先,沒有括號,A AND B OR C被解析爲(A AND B)或C ...不是你想要的。

僅供參考,一個CASE沒有ELSE條款等同於與ELSE NULL一個CASE,這就是爲什麼它是NULL時就是不匹配任何WHEN條款。

+0

不匹配的情況進行空 - 不知道+1 – VoodooChild