QA@IT

ORACLE SQL WHERE句でのCASEの使い方について

30483 PV

SQL初心者です。
掲題に関して、CACEの使い方がいまいちわかりませんので質問させていただきます。
以下のようにあるケースの場合にSELECTでとってきた値が'1'のものを条件にしたいのですが、どうもエラーとなってしまいます。
この方法自体使えないのでしょうか。
ご教授願います。

SELECT
・・・
FROM
・・・
WHERE
(CASE WHEN A IS NOT NULL THEN
(SELECT
B
FROM
TABLE)
END) = '1'
・・・

回答

参照するテーブルの構造とデータサンプル、Selectしたい内容のサンプルを提示した上で
作成したSQL文を載せないと構文エラーの間違いしか指摘することが出来ません。

提示されているSQL文から想像するところでは

CASE WHEN ~ THEN (Select文) END

のSelect文の結果が複数レコード返還しているためエラーとなっているのでは
ないでしょうか?条件を付加するかTop 1を付加するなどして1レコードに絞る
必要があります。

編集 履歴 (0)

Oracleエラー番号もテーブル構造もわからないので何とも言えませんが、
TABLE テーブルに2件以上入っているとエラー(ORA-01427)になるかと思います。

SELECTでとってきた値が'1'のものを条件にしたいのですが

これを言葉通りにとらえれば、

SELECT
・・・
FROM
・・・
WHERE
(CASE WHEN A IS NOT NULL THEN '1' END)
・・・

な気がするんですが、
(とってきた値が'1'のものを条件にする = 条件は'1'な気がする)

そうではなくて、別のテーブル(TABLE)のある列の値が '1' の B列 の値を条件にしたいということですかね?
だとすれば、'1'は Bを持つテーブルと比較することになるでしょう。
比較対象が書いていないので右辺をどうしたいのかはわかりませんが、以下の様にしてみてはどうでしょう。

SELECT
・・・
FROM
・・・
WHERE
(CASE WHEN A IS NOT NULL THEN
    (SELECT B FROM TABLE where C = '1')
 END) = 比較対象
・・・

SQLの実行確認はしていません。

編集 履歴 (0)

ケースの場合にSELECTでとってきた値が'1'のものを条件

CASE式より、EXISTS条件等を使えばいいのではないでしょうか。
CASEは、条件句に記述よりも 取得した値を 違う値に置き換えたい場合に
使うほうが便利のような気がします。

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。