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
-
カーソル定義での条件分岐
Oracle
-
カーソル宣言をIFで分けられませんか?
Oracle
-
-
4
場合によって条件を変えるSQL
Oracle
-
5
カーソル0件の時にエラーを発生させる
Oracle
-
6
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
7
FROM の中で CASE を使えるでしょうか
SQL Server
-
8
【PL/SQL】FROM区に変数を使う方法
Oracle
-
9
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
10
PL/SQL PLS-00103エラーについて
Oracle
-
11
PLSQLで条件によりSQLを動的に変えたい
Oracle
-
12
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
13
SQL Server Where句 Case文
SQL Server
-
14
ORCLEでの小数の表示方法の変更について
その他(データベース)
-
15
SQL>UPDATEと同時にその件数をCOUNTする方法
その他(データベース)
-
16
ストアド実行時のエラー「参照しているコレクションは初期化されていません」
Oracle
-
17
<a href=#" …>の意味を教えてください。"
HTML・CSS
-
18
Viewにインデックスは張れますか?
Oracle
-
19
CASE文のエラーについて
Oracle
-
20
Statement ignored というエラー
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
group byの並び順を変えるだけ...
-
SQL*Loader Append
-
アクセスのレポートでレコード...
-
【PL/SQL】FROM区に変数を使う方法
-
PL/SQL内の共通関数の引数にフ...
-
AccessのSQL文で1件のみヒット...
-
SQLで条件にヒットしたレコード...
-
引数によってwhere句を切り替え...
-
where句中のtrim関数について
-
「数字で始まらない」ものを抽...
-
1レコード全てを改行なしで表...
-
BLOB型項目をSQLの検索条件に指...
-
ACCESS レコードの並び順について
-
あるカラムに同じ値を持つレコ...
-
データ
-
レコードの更新履歴について
-
【SQL】日付が最大のレコード群...
-
単一グループのグループ関数で...
-
phpmyadminでワイルドカードを...
-
連続したデータを条件とするSQL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
group byの並び順を変えるだけ...
-
アクセスのレポートでレコード...
-
トランザクションログを出力せ...
-
データ
-
SELECT FOR UPDATE で該当レコ...
-
SQLで条件にヒットしたレコード...
-
「数字で始まらない」ものを抽...
-
引数によってwhere句を切り替え...
-
1レコード全てを改行なしで表...
-
BLOB型項目をSQLの検索条件に指...
-
updateで複数行更新したい
-
【SQL】違うフィールド同士の集...
-
osqleditについて
-
レコードの更新履歴について
-
あるカラムに同じ値を持つレコ...
おすすめ情報