SQL использует оператор CASE в предложении WHERE IN

Можно ли использовать case в предложении where in? Что-то вроде этого:

 DECLARE @Status VARCHAR(50);
 SET @Status='published';

 SELECT * FROM Product P    
 WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3)
                                   WHEN @Status='standby' THEN (2,5,9,6)
                                   WHEN @Status='deleted' THEN (4,5,8,10)
                                   ELSE (1,3)
                                   END)

Этот код выдает ошибку: Неверный синтаксис рядом с ','.


person POIR    schedule 09.10.2013    source источник
comment
что такое тип P.Status?   -  person Maryam Arshi    schedule 09.10.2013
comment
Вы можете использовать case в where, но не так. Case должен возвращать одно значение для каждого оператора.   -  person Sean    schedule 09.10.2013
comment
@MaryamArshi: тип P.Status — int.   -  person POIR    schedule 09.10.2013
comment
@SeanCoetzee. Я не понимаю. Можете ли вы привести пример?   -  person POIR    schedule 09.10.2013
comment
просто спрашиваю, какой смысл ТОГДА (2,5,9,6)?   -  person sathia    schedule 12.06.2015


Ответы (5)


Нет, вы не можете использовать case и in таким образом. Но ты можешь сделать

SELECT * FROM Product P    
WHERE @Status='published' and P.Status IN (1,3)
or @Status='standby' and P.Status IN  (2,5,9,6)
or @Status='deleted' and P.Status IN (4,5,8,10)
or P.Status IN (1,3)

Кстати, вы можете уменьшить это до

SELECT * FROM Product P    
WHERE @Status='standby' and P.Status IN (2,5,9,6)
or @Status='deleted' and P.Status IN (4,5,8,10)
or P.Status IN (1,3)

так как or P.Status IN (1,3) дает вам также все записи @Status='published' and P.Status IN (1,3)

person juergen d    schedule 09.10.2013
comment
Разве вам не нужны круглые скобки вокруг каждого предложения or? Например. или (@Status='ожидание' и P.Status IN (2,5,9,6)) - person dcp; 09.10.2013
comment
Не думайте, что вам нужны круглые скобки, но последний оператор or вернет ложные результаты... Посмотрите на эту скрипку - 2-я запись не должна возвращаться. sqlfiddle.com/#!3/9aef0/6 - person sgeddes; 09.10.2013
comment
И имеет более сильный приоритет, чем ИЛИ. Поэтому скобки в этом случае не нужны. - person juergen d; 07.07.2021

Я понимаю, что на это был дан ответ, но есть небольшая проблема с принятым решением. Он будет возвращать ложные срабатывания. Легко исправить:

SELECT * FROM Products P    
WHERE (@Status='published' and P.Status IN (1,3))
   or (@Status='standby' and P.Status IN  (2,5,9,6))
   or (@Status='deleted' and P.Status IN (4,5,8,10))
   or (@Status not in ('published','standby','deleted') and P.Status IN (1,2))

Скобки не нужны (хотя, возможно, их легче читать, поэтому я их и включил).

person sgeddes    schedule 09.10.2013

Я считаю, что вы можете использовать оператор case в предложении where, вот как я это делаю:

Select 
ProductID
OrderNo,
OrderType,
OrderLineNo
From Order_Detail
Where ProductID in (
Select Case when (@Varibale1 != '') 
then (Select ProductID from Product P Where .......)
Else (Select ProductID from Product)
End as ProductID
)

Этот метод работал для меня снова и снова. попытайся!

person Harry Grewal    schedule 07.12.2017
comment
У меня это сработало, создал временную таблицу, вставил необходимые продукты на основе условия параметра и присоединился к временной таблице, наконец, удалил временную таблицу. - person Ramesh Venkataswamy; 05.10.2020

может быть, вы можете попробовать этот способ

SELECT * FROM Product P WHERE (CASE WHEN @Status = 'published' THEN (CASE WHEN P.Status IN (1, 3) THEN 'TRUE' ELSE FALSE END) WHEN @Status = 'standby' THEN (CASE WHEN P.Status IN (2, 5, 9, 6) THEN 'TRUE' ELSE 'FALSE' END) WHEN @Status = 'deleted' THEN (CASE WHEN P.Status IN (4, 5, 8, 10) THEN 'TRUE' ELSE 'FALSE' END) ELSE (CASE WHEN P.Status IN (1, 3) THEN 'TRUE' ELSE 'FALSE' END) END) = 'TRUE'

Таким образом, если @Status = 'published', запрос проверит, находится ли P.Status среди 1 или 3, он вернет TRUE, иначе 'FALSE'. Это будет соответствовать TRUE в конце

Надеюсь, поможет.

person Rohan    schedule 28.06.2016

Согласно моему сценарию, я использовал оператор CASE в предложении WHERE IN, как показано ниже.

@AdjType varchar(20) = 'Value', 
@Base varchar(20) = 'Common'
where 
(select CASE WHEN SA.IsPersentage = 0 THEN 'Value' 
       WHEN SA.IsPersentage = 1 THEN 'Presentage' END) Like @AdjType
and (Select CASE WHEN SA.IsDependOnBasicSalary = 0 THEN 'Common' 
        WHEN SA.IsDependOnBasicSalary = 1 THEN 'Basic Salary' END) like @Base
person Rashmi Prabha    schedule 24.10.2020