Възможно ли е да използвате изявление CASE в клауза IN?
Това е опростена версия на онова, което се опитвам да компилирам правилно:
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )
Благодаря!
Отговори:
22 за отговор № 1CASE
връща само скаларна стойност. Можете да направите това вместо това. (Предполагам, като на вашия пример, че когато @StatusID = 99, стойността на StatusID от 99 не е съвпадение.)
select *
from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
or (@StatusID <> 99 and StatusID = @StatusID)
3 за отговор № 2
Не. Вместо това можете да го изведете навън
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)
Можете също да напишете това без изявлението за делото.
Друга опция е динамичен SQL, където всъщност създавате низ с SQL израза и след това го изпълнявате. Въпреки това, динамичният SQL изглежда като overkill в този случай.
0 за отговор № 3
Мислех, че ще направя това по различен начин с помощта на табличен инструмент за конструиране на таблици - не се допускат телевизионни канали в следващия контекст?
SELECT *
FROM MyTable
WHERE StatusID IN
(
SELECT
CASE
WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID )
ELSE @StatusID
END
)
0 за отговор № 4
Можете да направите това посредством TVC, но подходът е малко по-различен. Той не използва случай, но ще се мащабира по-добре, когато има няколко възможни варианта за избор:
SELECT *
FROM MyTable
join (values
(99,5),(99,11),(99,13),
(@StatusID , @StatusID)
) t(k,v) on t.k= @StatusID and t.v = StatusID)
или ако имате нужда от всичко в клаузата, където:
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)