- - PR -
SQL WHERE句で条件分岐の方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-07 19:15
最後が else 1 end を期待しているのかも・・ってこればかりは本人しかわかりませんね。元記事の記述だけから推測するにも限界が(汗 | ||||||||
|
投稿日時: 2007-05-07 23:45
saki1208です。
オプティマイザの出来によるんでしょうけど... 「OR条件」や「CASE文」よりも「UNION ALL」で個別に条件を指定した方が 速いかも... #最近、Oracleで似たようなことをしたもんで... #追記:決してOracleとSQLServerで出来不出来を言及するつもりはありませ んし、言及できるほどSQLServerを知りません。また、どの場合の方が出来 が良いかを言及するつもりもありません。 [ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-07 23:49 ] | ||||||||
|
投稿日時: 2007-05-08 02:46
1つ注意が必要なのは、ORとUNIONは交換可能なんですが、ORとUNION ALLは必ずしもそうではないという点です。使用する条件やカーディナリティに気をつけないと。 間違った結果が出てきちゃ、元も子もないですからね。 | ||||||||
|
投稿日時: 2007-05-08 03:54
saki1208です。
もちろん私自身はカーニーさんのご指摘の内容については理解しています。 # 確かに私の発言内容のみでは、誤解を招く恐れがありますねぇ。orz # UNION ALLを使用するためには、個々のSELECT文で重複するレコードが返って # こないようにする必要がある場合があります。<て言うか大抵の場合はそう? # ただしそれが保障されているならば、UNIONの場合に重複行の除外のために発 # 生するMARGE JOIN?を省略することができ、コストを抑えることができるかなぁ # と... # それが常に正しいかは分かりませんが... [ メッセージ編集済み 編集者: saki1208 編集日時 2007-05-08 04:00 ] | ||||||||
|
投稿日時: 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番目の条件は無視されます。 |