2015-10-21 5 views
0

Я имею ошибочное заявление:Использование СЛУЧАЯ внутри условного В статье

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 

Getting ошибку на линии:

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

Что по существу должно произойти, когда параметр деления передается (ALL EPCD), то предложение WHERE разрешит только делениям 'Epoxy', 'MDP', 'OTG', 'PSR', в противном случае он должен отфильтровать именно на этом divison, т.е. прохождение Epoxy в Отдел будет устанавливать WHERE, чтобы найти только Epoxy деление

ответ

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 + '%') 

Ваша логика перемешивает равенство, like и case в очень странных (и несовместимых) способами.

+0

Это работает, но я не понимаю, почему. Часть разделения имеет смысл, но для бизнеса, передавая '(All)', левая строка имеет значение true: '@Business = '(All)' ', поэтому она просто игнорирует право,' Business_CD = @ Business', что позволяет всем предприятиям в? – Sauron

+0

@Sauron. , , Да, так работают булевские операции. –

Смежные вопросы