ここから本文です

WHERE句でのCASEについて

ahsgrimm00さん

2012/6/1523:57:02

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

補足回答ありがとうございます。
少し補足があります。

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

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

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

閲覧数:
7,863
回答数:
1
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

2012/6/1617:45:04

CASE式の使い方に、誤解があるようです。

CASE式は、
(1)SELECT句の中で、特定の式または列の値を、場合分けして変える
(2)ORDER BY句の中で、特定の式または列の値を、場合分けしてソート順を変える
(3)検索条件式で、 例えば WHERE 列1=CASE式 で比較値を変える
といった使い方をします。

あくまでも式や列の値を、場合分けして変えるものであり、検索条件式を変えるといった性格のものではありません。
また、上記の(1)以外で使うと、大きな性能劣化要因にもなる場合があります。

提示された条件が適切なのか不明ですが、例えば次のような検索条件になります。

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

母体データはどのくらいあり、どの程度の行を検索するのでしょうか?
性能を重視するなら、「列B/1000=10」という検索条件も問題になります。「列B/1000」の値を扱うことが多いなら、その値を列に格納しておくといったことを行なった方がいいかも知れません。
後は、適切なインデクスの定義と、インデクスを有効利用できる検索条件式により、一定の性能確保が可能になります。

この質問は投票によってベストアンサーに選ばれました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。