0

変数のデフォルト値をチェックする必要があるシナリオがあります。変数がある場合は、Table2で条件付きでEXISTS部分をチェックする必要があり、デフォルト値がない場合は、Table3で条件付きでEXISTS部分をチェックする必要があります。

以下はサンプルコードです:-

SELECT * FROM tbl1 WHERE EXISTS (SELECT CASE WHEN @boolVar = 0 THEN (SELECT 'X' FROM tbl2 WHERE tbl1.col1 = tbl2.col1) ELSE (SELECT 'X' FROM tbl3 where tbl1.col1 = tbl3.col1) END)

テスト目的の定数を使用したデモクエリ:-

SELECT 1 WHERE EXISTS (SELECT CASE WHEN 1 = 0 THEN (SELECT 'X' WHERE 1=0) 
    ELSE (SELECT 'X' WHERE 1 = 2) END)

注:-上記のクエリは、単一の条件が満たされていない場合でも、常に1を返します。

OR演算子を同じように使用でき、どのように実現できるかはわかっていますが、両方のテーブルに特定のwhere句を満たす行がない場合でも、Table1からすべての行が返されることを知りたいと思います。

定数値のデモクエリで同じことを説明しようとしました。

助けてください。

4

2 に答える 2

4

クエリで一致するレコードが見つからない場合、基本的に次のようになります。

SELECT 1 WHERE EXISTS (SELECT NULL)

null値を含む行はまだ行であるため、EXISTSコマンドはtrueを返します。

null行を除外する条件を追加できます。

SELECT * FROM tbl1 WHERE EXISTS (
  SELECT 1 FROM (
    SELECT
      CASE WHEN @boolVar = 0 THEN (SELECT 'X' FROM tbl2 WHERE tbl1.col1 = tbl2.col1)
      ELSE (SELECT 'X' FROM tbl3 where tbl1.col1 = tbl3.col1)
      END AS Y
  ) Z
  WHERE Y IS NOT NULL
)
于 2012-09-03T09:24:41.177 に答える
0

念のため、別の方法を示します。

SELECT *
FROM Table1
WHERE EXISTS (
  SELECT 1
  FROM Table2
  WHERE @var = @defValue
    AND ... /* other conditions as necessary */
  UNION ALL
  SELECT 1
  FROM Table3
  WHERE @var <> @defValue
    AND ... /* other conditions as necessary */
);
于 2012-09-03T15:42:07.680 に答える