在条件IN子句中使用CASE

时间:2015-10-21 19:41:06

标签: sql sql-server case

我有失败的陈述:

select 
    value_1, value_2
from 
    zt_Report
where 
    Division_CD in CASE WHEN @Division ='(ALL EPCD)' THEN ('Epoxy', 'MDP', 'OTG', 'PSR') ELSE @Division END 
    and [Business_CD] like CASE WHEN @Business='(All)' THEN '%' ELSE @Business END 
    and [Plant_TX] like CASE WHEN @Plant='(All)' THEN '%' ELSE @Plant+'%' END 

在线上收到错误:

Where Division_CD in CASE WHEN @Division ='(ALL EPCD)' THEN ('Epoxy', 'MDP', 'OTG', 'PSR') ELSE @Division END

基本上需要发生的是当分割参数传递(ALL EPCD)时,WHERE子句将只允许分割'Epoxy', 'MDP', 'OTG', 'PSR',否则它应该精确地过滤该分区,即。将Epoxy传递到分部会将WHERE设置为仅定位Epoxy分区

1 个答案:

答案 0 :(得分:4)

这不是case的工作原理。它返回标量值,而不是列表。所以,你想做这样的事情:

Where (@Division = '(ALL EPCD)' and Division_CD IN ('Epoxy', 'MDP', 'OTG', 'PSR') or 
       Division_CD = @Division
      ) and 
      (@Business = '(All)' or Business_CD = @Business) and
      (@Plant = '(All)' or Plant_TX like @Plant + '%') 

你的逻辑是以非常奇怪(和不兼容)的方式混合平等,likecase