- PR -

SQL WHERE句で条件分岐の方法

投稿者投稿内容
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-05-07 19:15
引用:

ノラさんの書き込み (2007-05-07 17:30) より:
こういうやつでしょうか
コード:
select *
from aaa
where 1 = case when x=10 then case when y > 1000 then 1 else null end
               when x=20 then case when y > 2000 then 1 else null end
               when x=30 then case when y > 3000 then 1 else null end
               else null end




最後が
else 1 end
を期待しているのかも・・ってこればかりは本人しかわかりませんね。元記事の記述だけから推測するにも限界が(汗
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-07 23:45
saki1208です。

オプティマイザの出来によるんでしょうけど...

「OR条件」や「CASE文」よりも「UNION ALL」で個別に条件を指定した方が
速いかも...

#最近、Oracleで似たようなことをしたもんで...

#追記:決してOracleとSQLServerで出来不出来を言及するつもりはありませ
んし、言及できるほどSQLServerを知りません。また、どの場合の方が出来
が良いかを言及するつもりもありません。


[ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-07 23:49 ]
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-05-08 02:46
引用:

saki1208さんの書き込み (2007-05-07 23:45) より:
「OR条件」や「CASE文」よりも「UNION ALL」で個別に条件を指定した方が
速いかも...


1つ注意が必要なのは、ORとUNIONは交換可能なんですが、ORとUNION ALLは必ずしもそうではないという点です。使用する条件やカーディナリティに気をつけないと。
間違った結果が出てきちゃ、元も子もないですからね。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-05-08 03:54
saki1208です。

引用:

カーニーさんの書き込み (2007-05-08 02:46) より:
1つ注意が必要なのは、ORとUNIONは交換可能なんですが、ORとUNION ALLは必ずしもそうではないという点です。使用する条件やカーディナリティに気をつけないと。
間違った結果が出てきちゃ、元も子もないですからね。



もちろん私自身はカーニーさんのご指摘の内容については理解しています。

# 確かに私の発言内容のみでは、誤解を招く恐れがありますねぇ。orz

# UNION ALLを使用するためには、個々のSELECT文で重複するレコードが返って
# こないようにする必要がある場合があります。<て言うか大抵の場合はそう?
# ただしそれが保障されているならば、UNIONの場合に重複行の除外のために発
# 生するMARGE JOIN?を省略することができ、コストを抑えることができるかなぁ
# と...

# それが常に正しいかは分かりませんが...


[ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-08 04:00 ]
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2007-05-08 22:14
select *
from AAA
where (項目X = '10' AND 項目Y > '1000')
or (項目X = '20' AND 項目Y > '2000')
or (項目X = '30' AND 項目Y > '3000')

外してるかな。
こういうことじゃなくってですか?

--------------------------------------------------------------------------------

 厳密には、項目Xが’10’の時、
  「Where句で、項目Y > ’1000’」
 という条件のみを指定して、SELECTしたいのです。
--------------------------------------------------------------------------------

select *
from AAA
where (項目X = '10' AND 項目Y > '1000')

というSQL文を実行したいのなら Dynamic SQL で SQL文を生成して実行しなければならないでしょうが、
項目Xが’10’の時、
  「Where句で、項目Y > ’1000’」
 という条件のみで検索したいのなら、
 
where (項目X = '10' AND 項目Y > '1000')
or (項目X = '20' AND 項目Y > '2000')
or (項目X = '30' AND 項目Y > '3000')
=:
where (項目X = '10' AND 項目Y > '1000')
or (FALSE AND 項目Y > '2000')
or (FALSE AND 項目Y > '3000')
=:
where (項目X = '10' AND 項目Y > '1000')
or FALSE
or FALSE
=:
where (項目X = '10' AND 項目Y > '1000')
で、2,3番目の条件は無視されます。

スキルアップ/キャリアアップ(JOB@IT)