プロが教えるわが家の防犯対策術!

PL/SQLで開発しています。
一つのテーブルで検索条件(引数)によって検索するカラムを切り替えたいのですが、
カーソルをいくつも作らず、
一つのSELECT文で書く方法ってないのでしょうか?
OR条件などを使って考えたのですが、うまくいきません。。

(例)
SELECT *
FROM 売り上げ情報
WHERE (品番 = 引数1 OR 商品名 = 引数2)

引数が無い時は"引数1"・"引数2"がNULLになるので、
カラムがPKなどになっていれば引数が片方しかなくてもうまく動作するのですが、
制限などがかかっていなくNULLで登録されているデータが存在すると余計なデータまでとれてしまいます。
DECODEなどでカラムに存在しない値に変換しようかとも思ったのですが、
なんか不自然な気が@@;
いい方法があれば教えてください。

A 回答 (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)

この回答への補足

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

補足日時:2007/09/12 22:07
    • good
    • 1

WHERE (品番 = 引数1 OR 商品名 = 引数2)



WHERE (品番 = 引数1 and 引数1 is not null) OR (商品名 = 引数2 and 引数2 is not null)
とすれば良いのではないかと。
    • good
    • 3
この回答へのお礼

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

お礼日時:2007/09/29 02:26

> select文を丸ごと変数に代入する方法でしょうか?


> 調べてみたのですがそれっぽい方法が見つかりませんでした;;
> よろしければ詳しく教えてくださいm(_ _)m

→ Oracleのバージョンによって記述がかわりますが、
   10gなどでしたら。
   w_sql := 'select ・・・ ';
   execute immidiate w_sql;
という感じです。
   8iでしたら、 dbms_sqlパッケージを使います。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
返事大変遅れて申し訳ないです。

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

お礼日時:2007/09/29 02:24

勘違いしていました。


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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/29 02:21

「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))
で対応できます。
    • good
    • 0

PL/SQLならif文で切り分ければよいのでは?



:
begin
:
if 引数1 is null and 引数2 is null then
:
eleif 引数1 is null then
:
という感じで

この回答への補足

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

補足日時:2007/09/12 21:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す