
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で質問しましょう!
似たような質問が見つかりました
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- その他(Microsoft Office) EXCEL VLOOKUPに関する質問 5 2023/02/08 11:38
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- UNIX・Linux bash環境でのエラー対応をお願い致します。 1 2022/11/26 17:41
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
このQ&Aを見た人はこんなQ&Aも見ています
-
特定条件でWHERE句の条件を変更したい
SQL Server
-
カーソル宣言をIFで分けられませんか?
Oracle
-
カーソル0件の時にエラーを発生させる
Oracle
-
-
4
カーソル定義での条件分岐
Oracle
-
5
CASE文のエラーについて
Oracle
-
6
PLSQLで条件によりSQLを動的に変えたい
Oracle
-
7
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
8
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
9
単一グループのグループ関数ではありません。
Oracle
-
10
PL/SQLカーソルの2重FORループができません
Oracle
-
11
Statement ignored というエラー
Oracle
-
12
【PL/SQL】FROM区に変数を使う方法
Oracle
-
13
ストアドをまたがるローカル一時テーブル
SQL Server
-
14
PL/SQL PLS-00103エラーについて
Oracle
-
15
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
16
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
17
ストアドプロシージャ_カーソルのヒット件数
その他(データベース)
-
18
異なるスキーマからデータを抽出するには?oracl、PL/SQL
Oracle
-
19
SELECT 文の NULL列は?
PostgreSQL
-
20
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つの情報を1つのSQLで取...
-
レコードの選択の仕方
-
MERGE文について
-
DISTINCTの使い方について
-
ワイルドカード検索として合致...
-
SQLのINSERT文について
-
負荷試験の後重くなります。。。
-
SELECT文の結果を変数に・・・
-
【SQL】日付が最大のレコード群...
-
GROUP BY 又は HAVING句?
-
トランザクションログを出力せ...
-
oracle DB内のデータを増幅す...
-
mysqlimportについて
-
質問:年月日の表示方法について
-
INSERT後の並び替え
-
prologの引数
-
日付
-
PHPによるMySQL select文の操作...
-
AccessVBA OpenDatabaseメソッ...
-
GROUP BY使用時のソートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
group byの並び順を変えるだけ...
-
where句中のtrim関数について
-
【PL/SQL】FROM区に変数を使う方法
-
トランザクションログを出力せ...
-
SELECT FOR UPDATE で該当レコ...
-
引数によってwhere句を切り替え...
-
データ
-
SQL*Loader Append
-
AccessのSQL文で1件のみヒット...
-
updateで複数行更新したい
-
アクセスのレポートでレコード...
-
「数字で始まらない」ものを抽...
-
SQLで条件にヒットしたレコード...
-
デフォルトでデータが表示され...
-
osqleditについて
-
PL/SQL内の共通関数の引数にフ...
-
1レコード全てを改行なしで表...
-
トリガからプロシージャのコー...
-
BLOB型項目をSQLの検索条件に指...
おすすめ情報