我有以下查询:
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值。我该怎么做?请帮忙
答案 0 :(得分: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 ......不是你想要的。
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)