IN節の中でCASE文を使用できますか?IN句の中のCASE文の使用
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END)
感謝を:
これは私が正しくコンパイルするために取得しようとされているかどうかの簡易版です!
IN節の中でCASE文を使用できますか?IN句の中のCASE文の使用
SELECT * FROM MyTable
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13)
ELSE (@StatusID) END)
感謝を:
これは私が正しくコンパイルするために取得しようとされているかどうかの簡易版です!
CASE
は、スカラー値のみを返します。代わりにこれを行うことができます。 (私はあなたの例のように、@StatusID = 99は、99のStatusID値が一致しないときにことを、想定しています。)
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文なしでこれを書くこともできます。
もう1つのオプションは、実際にSQL文で文字列を作成して実行する動的SQLです。しかし、この場合、動的SQLは過剰なものに見えます。
私は他の人のバッチステートメントを読んだ後でこの構文について疑問を抱いていましたが、今はその理由を知っています。グレートチップ、ありがとう、@ gordon-linoff – Sung
私はこれをテーブルバリュエコンストラクタを使用して別の方法で試みると考えました - 次の文脈では許可されていないTVCですか?
SELECT *
FROM MyTable
WHERE StatusID IN
(
SELECT
CASE
WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID)
ELSE @StatusID
END
)
これはTVCを使用して行うことができますが、アプローチは少し異なります。それはケースを使用しませんが、から選択することが可能なオプションの数がある場合、それはよりうまくスケールします:あなたはその後、where句内のすべてを必要とする場合
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)
@ LittleBobbyTablesあなたの名前で、私はあなたがバックエンドでそれを変更することができると確信しています:) – RedFilter
ありがとう!素晴らしい解決策! – crjunk