- ベストアンサー
引数によってwhere句を切り替える方法
PL/SQLで開発しています。 一つのテーブルで検索条件(引数)によって検索するカラムを切り替えたいのですが、 カーソルをいくつも作らず、 一つのSELECT文で書く方法ってないのでしょうか? OR条件などを使って考えたのですが、うまくいきません。。 (例) SELECT * FROM 売り上げ情報 WHERE (品番 = 引数1 OR 商品名 = 引数2) 引数が無い時は"引数1"・"引数2"がNULLになるので、 カラムがPKなどになっていれば引数が片方しかなくてもうまく動作するのですが、 制限などがかかっていなくNULLで登録されているデータが存在すると余計なデータまでとれてしまいます。 DECODEなどでカラムに存在しない値に変換しようかとも思ったのですが、 なんか不自然な気が@@; いい方法があれば教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
※ 前の投稿は不完全な状態でした。 「NULLで登録されているデータが存在すると余計なデータまでとれてしまいます」 と言っていますが「引数が無い場合、NULLデータが抽出から漏れる」という事では ないでしょうか? where句でNULLデータは「is null」でないと真になりません。 【対応策】 where 引数1 is null or (引数1 is not null and 品番 = 引数1) or 引数2 is null or (引数2 is not null and 商品名 = 引数2)
その他の回答 (5)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
WHERE (品番 = 引数1 OR 商品名 = 引数2) を WHERE (品番 = 引数1 and 引数1 is not null) OR (商品名 = 引数2 and 引数2 is not null) とすれば良いのではないかと。
お礼
返信ありがとうございます。 返事大変遅れて申し訳ないです。 この方法を参考にsql作製出来ました。 ありがとうございます。。
- trictrac
- ベストアンサー率38% (10/26)
> select文を丸ごと変数に代入する方法でしょうか? > 調べてみたのですがそれっぽい方法が見つかりませんでした;; > よろしければ詳しく教えてくださいm(_ _)m → Oracleのバージョンによって記述がかわりますが、 10gなどでしたら。 w_sql := 'select ・・・ '; execute immidiate w_sql; という感じです。 8iでしたら、 dbms_sqlパッケージを使います。
お礼
返信ありがとうございます。 返事大変遅れて申し訳ないです。 記入忘れていて申し訳ありません。 もともとtrictrac様の書かれたやり方でしようと思っていたのですが、 編集などがややこしくなるため別の方法を探しておりました。 でもこのやり方がコスト面を考えると一番いい方法かもしれませんね。 検討してみます。 お返事ありがとうございました。。
- kazu1213
- ベストアンサー率60% (3/5)
勘違いしていました。 or条件なので引数がNULLのカラムは条件を無効にしたいのですね。 また「引数が無い時はNULLデータを抽出したくない」というのは A. 引数1と引数2の両方がNULLのケース の事でしょうか? A.の場合 1. 品番と商品名の両方がNULLのレコードは抽出しない という事なのでしょうか? それとも 2. 品番か商品名のどちらかがNULLのレコードは抽出しない という事なのでしょうか? それともA.のケースに関係なく 3. 引数がNULLのカラムはもう片方の条件で一致したレコードであっても NULLであれば抽出しない という事なのでしょうか? 【1.の対応策】 where 品番 = 引数1 or 商品名 = 引数2 or (引数1 is null and 引数2 is null and (品番 is not null or 商品名 is not null)) 【2.の対応策】 where 品番 = 引数1 or 商品名 = 引数2 or (引数1 is null and 引数2 is null and 品番 is not null and 商品名 is not null) 【3.の対応策】 where (品番 = 引数1 or 商品名 = 引数2 or (引数1 is null and 引数2 is null)) and 品番 is not null and 商品名 is not null
お礼
返信大変遅れて申し訳ありませんm(_ _)m 基本的に引数が無いものは検索条件からはずしたいのです。 空のものはis null判定で無いと取得できないのですか、 勘違いしていました。。 返信ありがとうございます。 解決できました。。
- kazu1213
- ベストアンサー率60% (3/5)
「NULLで登録されているデータが存在すると余計なデータまでとれてしまいます」ではなくて「引数が無い場合、NULLデータが抽出から漏れる」のでないでしょうか? where句でカラム(左辺)または引数(右辺)のどちらかにNULLが含まれている場合、「is null」判定でないと真にならないはずです。 その場合 where (引数1 is null or (引数1 is not null and 品番 = 引数1)) or (引数2 is null or (引数2 is not null and 商品名 = 引数2)) で対応できます。
- trictrac
- ベストアンサー率38% (10/26)
PL/SQLならif文で切り分ければよいのでは? : begin : if 引数1 is null and 引数2 is null then : eleif 引数1 is null then : という感じで
補足
select文を丸ごと変数に代入する方法でしょうか? 調べてみたのですがそれっぽい方法が見つかりませんでした;; よろしければ詳しく教えてくださいm(_ _)m
補足
引数が無い時はnullデータを抽出したくないのですが、 投稿した書き方だと nullのデータも取れていたような・・・ すいません、後日確認してみますm(_ _)m