2012-06-27 14 views
8

IN節の中でCASE文を使用できますか?IN句の中のCASE文の使用

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

感謝を:

これは私が正しくコンパイルするために取得しようとされているかどうかの簡易版です!

答えて

21

CASEは、スカラー値のみを返します。代わりにこれを行うことができます。 (私はあなたの例のように、@StatusID = 99は、99のStatusID値が一致しないときにことを、想定しています。)

select * 
from MyTable 
where (@StatusID = 99 and StatusID in (5, 11, 13)) 
    or (@StatusID <> 99 and StatusID = @StatusID) 
+1

@ LittleBobbyTablesあなたの名前で、私はあなたがバックエンドでそれを変更することができると確信しています:) – RedFilter

+0

ありがとう!素晴らしい解決策! – crjunk

3

号代わりに、あなたは

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は過剰なものに見えます。

+1

私は他の人のバッチステートメントを読んだ後でこの構文について疑問を抱いていましたが、今はその理由を知っています。グレートチップ、ありがとう、@ gordon-linoff – Sung

0

私はこれをテーブルバリュエコンストラクタを使用して別の方法で試みると考えました - 次の文脈では許可されていないTVCですか?

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

これは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)