- 締切済み
WHERE句でのCASEについて
WHERE句でのCASEの使い方についてご教授下さい。 以下の3分岐でSELECTしようとしています。 項目A=1なら、 項目B / 1000=10 のデータを。 項目A=2なら、 項目C=C のデータを。 項目A=3なら、 項目B / 1000=10 かつ項目D=D のデータを。 ※しばらくPCに触れないので確認不可ですが以下は試みたい方法です。 ただ心配なのは、例えば項目A=1のときに項目B / 1000 = 10を満たすデータと満たさないデータが存在する場合、 満たすデータまでもが抽出されないのではという心配があります。 SELECT * FROM テーブル WHERE 1 = CASE WHEN 項目A=1 THEN CASE WHEN 項目B / 1000 = 10 THEN 1 ELSE END WHEN 項目A=2 THEN CASE WHEN 項目C = C THEN 1 ELSE END WHEN 項目A=3 THEN CASE WHEN 項目B / 1000 = 10 AND 項目D = D THEN 1 ELSE END ELSE END
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- root139
- ベストアンサー率60% (488/809)
条件は個々の行に適用されるという事でしょうか? であるならば、 ・項目A=1 かつ 項目B / 1000=10 ・項目A=2 かつ 項目C=C ・項目A=3 かつ 項目B / 1000=10 かつ 項目D=D のどれかを満たすデータを抽出する、ということと同じになり、CASE式を使わなくても記述できます。 例) ------------------------------------ SELECT * FROM テーブル WHERE A = 1 AND B / 1000 = 10 OR A = 2 AND C = 'C' OR A = 3 AND B / 1000 = 10 AND D = 'D' ---------------------------------------- なお、提示されているSQLでも、細かな文法エラーを修正すれば、意図通りの結果が抽出できるようですよ。 (項目C = 'C'、項目D = 'D'、各ELSE句の値として 0 を追加) 各SQLは PostgreSQL 8.3.7 で確認しました。
お礼
回答ありがとうございます。 いまさらですが少し補足があります。 "項目A"とありますが、これは受け渡されたパラメータ項目(@A)です。 質問の記述内容だとテーブル項目のことだと誤解を招きますね・・・。 元々、Where条件は1つだけだったのですが、 パラメータ"@A"の選択値によってSelect条件を変えるということになりました。 また、回答者様のおっしゃるようにCase未使用でも実現できそうですが、 開発標準に準拠せざるを得ないためCaseを使用することになっています。