过滤CASE语句中的NULL值

时间:2011-08-09 21:26:25

标签: sql sql-server sql-server-2008

我有以下查询:

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值。我该怎么做?请帮忙

2 个答案:

答案 0 :(得分:2)

CASE条款不匹配的WHENNULL,因此只需使用该事实即可将代码转换为简单匹配:

...
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 ......不是你想要的。

fyi,CASE没有ELSE子句相当于带有CASE的{​​{1}},这就是ELSE NULL何时不匹配的原因任何NULL条款。

答案 1 :(得分: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)