アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (1件)

条件は個々の行に適用されるという事でしょうか?



であるならば、
・項目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 で確認しました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

いまさらですが少し補足があります。

"項目A"とありますが、これは受け渡されたパラメータ項目(@A)です。
質問の記述内容だとテーブル項目のことだと誤解を招きますね・・・。

元々、Where条件は1つだけだったのですが、
パラメータ"@A"の選択値によってSelect条件を変えるということになりました。

また、回答者様のおっしゃるようにCase未使用でも実現できそうですが、
開発標準に準拠せざるを得ないためCaseを使用することになっています。

お礼日時:2012/06/17 12:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!