12

IN 句内で CASE ステートメントを使用することは可能ですか?

これは、正しくコンパイルしようとしてきたものの単純化されたバージョンです。

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

ありがとう!

4

4 に答える 4

28

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

select *
from MyTable
where (@StatusID = 99 and StatusID in (5, 11, 13))
    or (@StatusID <> 99 and StatusID = @StatusID)
于 2012-06-27T18:00:56.557 に答える
5

いいえ、代わりに外に置くことができます

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 ステートメントを使用して文字列を作成し、それを実行します。ただし、この場合、動的 SQL はやり過ぎのように見えます。

于 2012-06-27T18:02:17.893 に答える
0

テーブル値コンストラクターを使用してこれを別の方法で試みると思いました-次のコンテキストでは TVC は許可されていませんか?

SELECT * 
FROM MyTable  
WHERE StatusID IN 
   ( 
   SELECT 
       CASE 
         WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID )
         ELSE @StatusID 
   END  
   ) 
于 2012-06-28T06:35:26.020 に答える