• ベストアンサー

引数によってwhere句を切り替える方法

PL/SQLで開発しています。 一つのテーブルで検索条件(引数)によって検索するカラムを切り替えたいのですが、 カーソルをいくつも作らず、 一つのSELECT文で書く方法ってないのでしょうか? OR条件などを使って考えたのですが、うまくいきません。。 (例) SELECT * FROM 売り上げ情報 WHERE (品番 = 引数1 OR 商品名 = 引数2) 引数が無い時は"引数1"・"引数2"がNULLになるので、 カラムがPKなどになっていれば引数が片方しかなくてもうまく動作するのですが、 制限などがかかっていなくNULLで登録されているデータが存在すると余計なデータまでとれてしまいます。 DECODEなどでカラムに存在しない値に変換しようかとも思ったのですが、 なんか不自然な気が@@; いい方法があれば教えてください。

  • Oracle
  • 回答数6
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • kazu1213
  • ベストアンサー率60% (3/5)
回答No.3

※ 前の投稿は不完全な状態でした。 「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)

saikano07
質問者

補足

引数が無い時はnullデータを抽出したくないのですが、 投稿した書き方だと nullのデータも取れていたような・・・ すいません、後日確認してみますm(_ _)m

その他の回答 (5)

回答No.6

WHERE (品番 = 引数1 OR 商品名 = 引数2) を WHERE (品番 = 引数1 and 引数1 is not null) OR (商品名 = 引数2 and 引数2 is not null) とすれば良いのではないかと。

saikano07
質問者

お礼

返信ありがとうございます。 返事大変遅れて申し訳ないです。 この方法を参考にsql作製出来ました。 ありがとうございます。。

  • trictrac
  • ベストアンサー率38% (10/26)
回答No.5

> select文を丸ごと変数に代入する方法でしょうか? > 調べてみたのですがそれっぽい方法が見つかりませんでした;; > よろしければ詳しく教えてくださいm(_ _)m → Oracleのバージョンによって記述がかわりますが、    10gなどでしたら。    w_sql := 'select ・・・ ';    execute immidiate w_sql; という感じです。    8iでしたら、 dbms_sqlパッケージを使います。

saikano07
質問者

お礼

返信ありがとうございます。 返事大変遅れて申し訳ないです。 記入忘れていて申し訳ありません。 もともとtrictrac様の書かれたやり方でしようと思っていたのですが、 編集などがややこしくなるため別の方法を探しておりました。 でもこのやり方がコスト面を考えると一番いい方法かもしれませんね。 検討してみます。 お返事ありがとうございました。。

  • kazu1213
  • ベストアンサー率60% (3/5)
回答No.4

勘違いしていました。 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

saikano07
質問者

お礼

返信大変遅れて申し訳ありませんm(_ _)m 基本的に引数が無いものは検索条件からはずしたいのです。 空のものはis null判定で無いと取得できないのですか、 勘違いしていました。。 返信ありがとうございます。 解決できました。。

  • kazu1213
  • ベストアンサー率60% (3/5)
回答No.2

「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)
回答No.1

PL/SQLならif文で切り分ければよいのでは? : begin : if 引数1 is null and 引数2 is null then : eleif 引数1 is null then : という感じで

saikano07
質問者

補足

select文を丸ごと変数に代入する方法でしょうか? 調べてみたのですがそれっぽい方法が見つかりませんでした;; よろしければ詳しく教えてくださいm(_ _)m

関連するQ&A

  • WHERE句の条件を区別する

    こんばんは 業務で以下の切り分けをしたいのですが、可能でしょうか。 SOAP通信を使っていて、パフォーマンス的な観点から、select文は使用したくないと思っています。 ■環境 ・PHP5 ・MySQL ・FreeBSD6 ■やりたいこと Update文で更新を行ったときに、データそのものがなくて更新できなかったのか、データは存在するがPK以外の条件がマッチしなくて更新できなかったのかで、エラーコードを分けたい 例えば、  update tableA set column1='aaa' where pk1=1 and pk2=2 and column2='bbb'; といったSQL文で、「pk1=1 and pk2=2」に合致するデータがないのか、データは存在するが「column2='bbb'」には合致しなくて更新されないのかの切り分けをしたいのです。 かなり、困ってしまっています。 SQL文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!

  • SELECT文のWHERE句についてご教授下さい。

    SELECT文のWHERE句についてご教授下さい。 ┏━┳━━━━┳━━━━┳━━━━┳━━━━┓ ┃No┃パターン_┃データA__┃データB__┃データC__┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃01┃001_________┃P1だけ___┃NULL_____┃共通________┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃02┃001_________┃P1のみ___┃NULL_____┃共通_______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃03┃002_________┃NULL_____┃P2だけ___┃NULL______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃04┃002_________┃NULL_____┃P2のみ___┃共通_______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃05┃002_________┃NULL_____┃P2のみ___┃NULL______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃06┃003_________┃HOGE11_┃NULL______┃共通_______┃ ┗━┻━━━━┻━━━━┻━━━━┻━━━━┛ 上記のようなテーブル構造のデータがあり、 それぞれのカラムに対して検索できるWebの画面があります。 以下の要件を満たすSELECT文はどのように作成すればよいでしょうか? パターン「001」の場合だけ、データA列を検索条件に加える。 パターン「002」の場合だけ、データB列を検索条件に加える。 全パターン共通して、データC列は検索条件に加える。 【具体例】  以下の検索条件が指定された場合は、No「01と04と06」がHITする。   パターン=「001、002、003」   データA=「P1だけ」   データB=「P2のみ」   データC=「共通」

  • SQL where区で(-1)を使用したい

    SQL文のwhere区で(-1)を使用したいのですがどなたかアドバイスお願いします。 SQLをプロシージャにして検索条件を引数で渡そうと考えています。 検索したくない引数には(-1)を入れて渡したいです。 select * from X where X.1 = 'QQQ' and (引数 = -1 or X.2 = 引数) といった感じで、引数で(-1)を渡した場合 (-1 = -1 or X.2 = -1) となりwhere区で使用しない様作成したいと思っています。 この方法ではDATETIME型に対してはエラーとなるため出来ません。 良い方法は無いでしょうか。 よろしくお願いします。

  • count関数の値をwhere句で使用する方法について

    宜しくお願い致します。 例えば、下記の様にデータを検索します。 select column1,count(column2) as column2_num from hoge_table group by column2_num すると、検索結果にはcolumn1のそのままの値と、column2の合計数が表示されると思います。 このcolumn2の合計数に対してwhere句で絞込みを行う方法はありませんか? asで定義した値をそのままwhere句で使用できないとの事なので、 select column1,count(column2) as column2_num from hoge_table where count(column2) = '1' group by column2_num とやってみたんですが、検索出来ませんでした。 ご存知の方、ご教授の程、宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQLのWHERE句を条件によって追加したい

    SQLのWHERE句にパラメータで渡された値がnullでない場合は条件に 含めるようにしたいのですが、書き方が分かりません。 CASEを使って書いてもエラーになってしまいます。 SELECT 項目1 ,項目2 FROM テーブル WHERE 条件1 = パラメータ1 AND 条件2 = パラメータ2 -- パラメータ3がnullでない場合は下記条件を付けたい AND 条件3 = パラメータ3 使っているのはpostgresqlです。 よろしくお願いします。

  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)

  • WHERE句で書いた順に表示するには

    WHEREに以下の順で検索した時に select * from tb where  ( id = 'i004' ) or ( id = 'i001' ) or ( id = 'i003' ) 書いた順に、 name id ---------- jun i004 kei i001 tom i003 と引き出したいのですが、 解決方法があれば、是非ご教授していただきたいです。

    • ベストアンサー
    • MySQL
  • sql文のwhere句について

    <環境>sqlserver SQLでパラメータが空白であれば全件取得、パラメータに値が設定されている場合には 条件にHITするデータを抽出したいのですが、一本のクエリで抽出することができるのでしょうか? 空白時パラメータは以下のとおり入ってきます。 @no="" …完全一致 @name="%%" …部分一致 例) SELECT * FROM テーブル WHERE (NO = @no) and ((@name IS NULL) OR (@name IS NOT NULL) AND (NAME LIKE @name)) NAMEは上記クエリにて取得できています。 NOのところはどのようにすればよいでしょうか?

  • PHP埋め込みのMySQLでwhere句が上手くいかない

    PHPのモジュールにMySQLのSELECT文を埋め込み、 where句でデータベースからデータを読込もう としています。 ところが、下記select文のand以下が無視され、 where句で指示した通りの結果が出ません。 文法的におかしいのでしょうか? どなたかアドバイスいただければ幸いです。 条件などは下記の通りです。 環境: OS Fedora Core5 MySQL 5.0.27 PHP 5.1.6 select文 "SELECT * FROM wrma_tbl where mise_id = $mise_code and (enddate is NULL) or (enddate > $maedate)" select文の説明: (1)DBの支店id(mise_id)と入力された支店code(mise_code)が一致すること…これは問題ない (2)作業終了日付(enddate)がNULLはピックアップする (3)作業終了日付(enddate)が今日(dateで抽出、yyyy-mm-dd)から30日前(maedate←正規の関数で計算済み)以前をオミット

  • is null のandについて(日付型)

    SQLのSELECTで困っています。 プロシージャに引数を渡してSELECTしようと考えています。 複数の日付(datetime)型の引数をand条件で結びたいです。 検索したくない場合はnullを渡す。 例) select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) ===== B,C,D はdatetimeです。 この形ですと、B,C,D全ての引数に日付が入っていれば取得できる のですが一箇所でも引数に何もセットしないと値0件で帰ってきて しまいます。 せっかく(is null)を使用しているのに意味がありません。 良いお知恵は無いでしょうか。 よろしくお願いします。