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も見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
特定条件でWHERE句の条件を変更したい
SQL Server
-
カーソル定義での条件分岐
Oracle
-
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
-
4
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
5
Statement ignored というエラー
Oracle
-
6
カーソル宣言をIFで分けられませんか?
Oracle
-
7
CASE文のエラーについて
Oracle
-
8
異なるスキーマからデータを抽出するには?oracl、PL/SQL
Oracle
-
9
カーソル0件の時にエラーを発生させる
Oracle
-
10
SELECTで1件のみ取得するには?
Oracle
-
11
PL/SQL PLS-00103エラーについて
Oracle
-
12
場合によって条件を変えるSQL
Oracle
-
13
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
14
PL/SQLカーソルの2重FORループができません
Oracle
-
15
【PL/SQL】FROM区に変数を使う方法
Oracle
-
16
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
-
17
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
18
SELECT 文 GROUP での1件目を取得
SQL Server
-
19
Handlesについて
Visual Basic(VBA)
-
20
FROM の中で CASE を使えるでしょうか
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLで条件にヒットしたレコード...
-
引数によってwhere句を切り替え...
-
単一グループのグループ関数で...
-
oracle 2つの列の比較
-
where句中のtrim関数について
-
SELECT FOR UPDATE で該当レコ...
-
「数字で始まらない」ものを抽...
-
AccessのSQL文で1件のみヒット...
-
BLOB型項目をSQLの検索条件に指...
-
アクセスのレポートでレコード...
-
PL/SQL内の共通関数の引数にフ...
-
oracle DB内のデータを増幅す...
-
【PL/SQL】FROM区に変数を使う方法
-
デフォルトでデータが表示され...
-
トランザクションログを出力せ...
-
SQL*Loader Append
-
レコードの更新履歴について
-
2つの情報を1つのSQLで取...
-
並べ替えについて
-
テーブルの最後(最新)のレコー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
group byの並び順を変えるだけ...
-
where句中のtrim関数について
-
SQL*Loader Append
-
データ
-
SELECT FOR UPDATE で該当レコ...
-
「数字で始まらない」ものを抽...
-
トランザクションログを出力せ...
-
SQLで条件にヒットしたレコード...
-
アクセスのレポートでレコード...
-
AccessのSQL文で1件のみヒット...
-
引数によってwhere句を切り替え...
-
BLOB型項目をSQLの検索条件に指...
-
レコードの更新履歴について
-
1レコード全てを改行なしで表...
-
大量レコードをTRUNCATEせずに...
-
ACCESS レコードの並び順について
-
デフォルトでデータが表示され...
-
PL/SQL内の共通関数の引数にフ...
おすすめ情報