/ / Използване на CASE Statement в IN Клауза - sql, sql-server, sql-server-2008, tsql

Използване на CASE Statement в IN Clause - sql, sql-server, sql-server-2008, tsql

Възможно ли е да използвате изявление CASE в клауза IN?

Това е опростена версия на онова, което се опитвам да компилирам правилно:

SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END )

Благодаря!

Отговори:

22 за отговор № 1

CASE връща само скаларна стойност. Можете да направите това вместо това. (Предполагам, като на вашия пример, че когато @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)