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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
特定条件でWHERE句の条件を変更したい
SQL Server
-
カーソル定義での条件分岐
Oracle
-
カーソル宣言をIFで分けられませんか?
Oracle
-
-
4
カーソル0件の時にエラーを発生させる
Oracle
-
5
場合によって条件を変えるSQL
Oracle
-
6
SQL Server Where句 Case文
SQL Server
-
7
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
8
FROM の中で CASE を使えるでしょうか
SQL Server
-
9
SQL文で右から1文字だけ削除するやり方
MySQL
-
10
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
11
PL/SQLカーソルの2重FORループができません
Oracle
-
12
PL/SQLでログを確認したい。
Oracle
-
13
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
14
【PL/SQL】FROM区に変数を使う方法
Oracle
-
15
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
16
selectした結果の余計な余白を取るにはどうしたらよいのでしょうか
Oracle
-
17
バッチからsqlplusの接続エラーの検知について
その他(プログラミング・Web制作)
-
18
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
19
select文の実行結果に空白行を入れたい
MySQL
-
20
PL/SQLのコンパイルエラーについて(ignored)
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
アクセスのレポートでレコード...
-
これをSQL文で出来るでしょうか?
-
トランザクションログを出力せ...
-
大量レコードをTRUNCATEせずに...
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
SELECT FOR UPDATE で該当レコ...
-
一気に複数のレコードをinsert...
-
なぜ、WHERE句とHAVING句がある...
-
ORMについて
-
SQL*Loader Append
-
440 OIP エラーについて(ORADC)
-
複数レコードを横並び1レコー...
-
データ
-
エクセルで抽出した不特定数の...
-
group byの並び順を変えるだけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
アクセスのレポートでレコード...
-
where句中のtrim関数について
-
group byの並び順を変えるだけ...
-
引数によってwhere句を切り替え...
-
SQL*Loader Append
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
データ
-
トランザクションログを出力せ...
-
「数字で始まらない」ものを抽...
-
大量レコードをTRUNCATEせずに...
-
osqleditについて
-
BLOB型項目をSQLの検索条件に指...
-
これをSQL文で出来るでしょうか?
-
ACCESS レコードの並び順について
-
【SQL】違うフィールド同士の集...
おすすめ情報