Использование оператора CASE внутри предложения IN
можно ли использовать оператор CASE внутри предложения IN?
это упрощенная версия того, что я пытался правильно скомпилировать:
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )
спасибо!
4 ответов
CASE
возвращает единственное скалярное значение. Вы можете сделать это вместо этого. (Я предполагаю, согласно вашему примеру, что когда @StatusID = 99, значение StatusID 99 не совпадает.)
select *
from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
or (@StatusID <> 99 and StatusID = @StatusID)
нет. Вместо этого вы можете поместить его снаружи
SELECT *
FROM MyTable
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1
WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1
ELSE 0
END)
вы также можете написать это без оператора case.
другой вариант-динамический SQL, где вы фактически создаете строку с инструкцией SQL, а затем выполняете ее. Однако в этом случае динамический SQL кажется излишним.
Я думал, что попробую это по-другому, используя конструктор таблицы Valuue - TVCs не разрешены в следующем контексте?
SELECT *
FROM MyTable
WHERE StatusID IN
(
SELECT
CASE
WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID )
ELSE @StatusID
END
)
вы можете сделать это с помощью TVCs, но подход немного отличается. Он не использует case, но он будет масштабироваться более красиво, где есть несколько возможных вариантов на выбор:
SELECT *
FROM MyTable
join (values
(99,5),(99,11),(99,13),
(@StatusID , @StatusID)
) t(k,v) on t.k= @StatusID and t.v = StatusID)
или если вам нужно все в предложении where, то:
SELECT *
FROM MyTable
WHERE exists (
select 1
from (values
(99,5),(99,11),(99,13),
(@StatusID , @StatusID)
) t(k,v)
where t.k= @StatusID and t.v = StatusID)