実現したいこと
SQL Serverにおいて、where句にcase whenを使いたいです。
(例)
select
hoge
from
temp1
where
col1=1
and
case when
col2=2 then col3=3 and col4=4
case when
col5=5 then col6=6 and col7=7
end
発生している問題・分からないこと
then 後の最初の=のところで、「'=' 付近に不適切な構文があります」のエラーがでます。
エラーメッセージ
error
1'=' 付近に不適切な構文があります。 2
該当のソースコード
SQL
1select 2 hoge 3from 4 temp1 5where 6 col1=1 7 and 8 case when 9 col2=2 then col3=3 and col4=4 10 case when 11 col5=5 then col6=6 and col7=7 12end
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
同様の試みが見つかりませんでした。
補足
特になし
case when 後には質問文、その後のthenには値が来ます。
あとSQLの=は厳密には代入ではなく、代入することによって成立する真偽の判定です。
回答ありがとうございます。
thenには値が来る、とのことですが、ここに比較を書くことはできないのでしょうか?
>col2=2 then col3=3 and col4=4
ここの部分はどういう意味として書いていますか?
col2=2かつcol3=3かつcol4=4のデータを引っかけたいのですか?
それとも
col2が2の時はcol3に3、col4に4を代入したいといった意味で書いてますか?
もし前者であるならyambejpさんの回答のように普通に条件を書けばいいと思います。
回答ありがとうございます。
ここは、col2=2のとき、whereの条件をcol3=3 and col4=4にしたい、という意味です。
可能でしょうか?
>col2=2のとき、whereの条件をcol3=3 and col4=4にしたい
それは
col2=2 and col3=3 and col4=4
ではないのですか?
というかyambejpさんの回答ではダメなのですか?
入れ子にすることで理論上は可能ですけど、回答者の通りand文とor文を組み合わせたほうが賢明な気がします。まずは回答者の通りにやってみては?
どちらかというとcase文はselect句で使うことが多いのと、where句にcase文を使うと確実に処理が遅くなります(確定した値を別の値に振り分けるのと、条件で振り分けるのではケースがまるで違うので)
コメントありがとうございます。試したところ問題が解決しました!
ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
BAには望ましくない(パフォーマンス最悪なので他のエンジニアに真似してほしくない)ので今回は辞退します。