1. ホーム
  2. sql-server

[解決済み] WHERE句の中にCASE文を入れ、複数の値を返す方法

2022-03-10 20:06:54

質問

私が扱っているクエリの表現は以下の通りです。

SELECT T1.Col3
FROM Table1 T1
WHERE T1.Col1 IN ('Value1','Value2')
     AND (CASE
            WHEN T1.Col1 = 'Value1'
                THEN  T1.Col2 IN ('Value3','Value4','Value5')
            WHEN T1.Col1 = 'Value2'
                THEN  T1.Col2 IN ('Value6','Value7','Value8')
            END
         )

なぜかいつも2つ目のwhenのあたりでシンタックスでErrorになります。 また、両方のIN文の最初のコンマでシンタックスエラーが出ますが、2番目は出ません。特に違いはないのですが、ネストされたIN文を以下のようにOR文に変えてみました。

THEN (T1.COL2 = 'Value3') OR (T1.COL2 = 'Value4') OR (T1.COL2 = 'Value5')

その代わり、最初のOR文のあたりでシンタックスエラーが発生します。

以前、WHERE句でCASEを使ったことがありますが、1つの値しか返されませんでした。最初のカンマかOR文のどちらかで構文エラーが発生するということは、複数の値を返すことは不可能なのではと思います。

この問題を解決するためのヒントがあれば、非常にありがたいです。

P.S. 私はすでに一時テーブルを作成し、その上で条件付きDELETE文を実行することで回避策を持っています。しかし、私はこの質問に関する他の方法が可能であるかどうかを知りたいと思っています。

どのように解決するのですか?

を簡略化することができます。 WHERE の基準は以下の通りです。

SELECT T1.Col3
FROM Table1 T1
WHERE 
(
   (T1.Col1 = 'Value1' AND T1.Col2 IN ('Value3','Value4','Value5'))
   OR
   (T1.Col1 = 'Value2' AND T1.Col2 IN ('Value6','Value7','Value8'))
)

同じクエリを2つのクエリとして記述する場合は UNION :

SELECT T1.Col3
FROM Table1 T1
WHERE T1.Col1 = 'Value1'
AND T1.Col2 IN ('Value3','Value4','Value5')

UNION -- note that this will return distinct results

SELECT T1.Col3
FROM Table1 T1
WHERE T1.Col1 = 'Value2'
AND T1.Col2 IN ('Value6','Value7','Value8')

ただし WHEREOR

CREATE INDEX IX_Table1_Col1_Col2_Incl ON Table1 (Col1, Col2) INCLUDE (Col3)