
PL/SQLで開発しています。
一つのテーブルで検索条件(引数)によって検索するカラムを切り替えたいのですが、
カーソルをいくつも作らず、
一つのSELECT文で書く方法ってないのでしょうか?
OR条件などを使って考えたのですが、うまくいきません。。
(例)
SELECT *
FROM 売り上げ情報
WHERE (品番 = 引数1 OR 商品名 = 引数2)
引数が無い時は"引数1"・"引数2"がNULLになるので、
カラムがPKなどになっていれば引数が片方しかなくてもうまく動作するのですが、
制限などがかかっていなくNULLで登録されているデータが存在すると余計なデータまでとれてしまいます。
DECODEなどでカラムに存在しない値に変換しようかとも思ったのですが、
なんか不自然な気が@@;
いい方法があれば教えてください。
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)
この回答への補足
引数が無い時はnullデータを抽出したくないのですが、
投稿した書き方だと
nullのデータも取れていたような・・・
すいません、後日確認してみますm(_ _)m
No.5
- 回答日時:
> select文を丸ごと変数に代入する方法でしょうか?
> 調べてみたのですがそれっぽい方法が見つかりませんでした;;
> よろしければ詳しく教えてくださいm(_ _)m
→ Oracleのバージョンによって記述がかわりますが、
10gなどでしたら。
w_sql := 'select ・・・ ';
execute immidiate w_sql;
という感じです。
8iでしたら、 dbms_sqlパッケージを使います。
返信ありがとうございます。
返事大変遅れて申し訳ないです。
記入忘れていて申し訳ありません。
もともとtrictrac様の書かれたやり方でしようと思っていたのですが、
編集などがややこしくなるため別の方法を探しておりました。
でもこのやり方がコスト面を考えると一番いい方法かもしれませんね。
検討してみます。
お返事ありがとうございました。。
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
返信大変遅れて申し訳ありませんm(_ _)m
基本的に引数が無いものは検索条件からはずしたいのです。
空のものはis null判定で無いと取得できないのですか、
勘違いしていました。。
返信ありがとうございます。
解決できました。。
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))
で対応できます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
特定条件でWHERE句の条件を変更したい
SQL Server
-
PLSQLで条件によりSQLを動的に変えたい
Oracle
-
カーソル宣言をIFで分けられませんか?
Oracle
-
-
4
カーソル0件の時にエラーを発生させる
Oracle
-
5
カーソル定義での条件分岐
Oracle
-
6
CASE文のエラーについて
Oracle
-
7
【PL/SQL】FROM区に変数を使う方法
Oracle
-
8
Statement ignored というエラー
Oracle
-
9
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
10
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
11
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
12
単一グループのグループ関数ではありません。
Oracle
-
13
ストアドをまたがるローカル一時テーブル
SQL Server
-
14
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
15
PL/SQL PLS-00103エラーについて
Oracle
-
16
PL/SQLによるCREATE TABLE後のINSERTができない
Oracle
-
17
GROUP BYを行った後に結合したい。
Oracle
-
18
PL/SQL で continue ?
Oracle
-
19
ストアドプロシージャ_カーソルのヒット件数
その他(データベース)
-
20
シェルスクリプトでオラクルのエラーメッセージを取得するには
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
updateで複数行更新したい
-
AccessのSQL文で1件のみヒット...
-
データ
-
osqleditについて
-
oracle DB内のデータを増幅す...
-
SELECT FOR UPDATE で該当レコ...
-
where句中のtrim関数について
-
デフォルトでデータが表示され...
-
アクセスのレポートでレコード...
-
PL/SQL内の共通関数の引数にフ...
-
Oracle10gからkeySQLで集計データ
-
Oracleですがsqlで質問です。 ...
-
phpmyadminでワイルドカードを...
-
ファイルメーカープロで実用的...
-
トランザクションログを出力せ...
-
ACCESS2007のエクスポート上限
-
小規模なデータベース
-
group byの並び順を変えるだけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
SELECT FOR UPDATE で該当レコ...
-
【PL/SQL】FROM区に変数を使う方法
-
where句中のtrim関数について
-
データ
-
SQL*Loader Append
-
AccessのSQL文で1件のみヒット...
-
引数によってwhere句を切り替え...
-
トランザクションログを出力せ...
-
updateで複数行更新したい
-
アクセスのレポートでレコード...
-
group byの並び順を変えるだけ...
-
「数字で始まらない」ものを抽...
-
osqleditについて
-
SQLで条件にヒットしたレコード...
-
デフォルトでデータが表示され...
-
BLOB型項目をSQLの検索条件に指...
-
1レコード全てを改行なしで表...
-
トリガからプロシージャのコー...
-
PL/SQLでフェッチでNULLの項目...
おすすめ情報