質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

4483閲覧

Oracle Select文 引数がnullなら全件検索、引数があるならwhere句に設定したい

King_of_Flies

総合スコア382

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/10/26 07:44

編集2018/10/26 08:56

SQL

1declare 2 hoge varchar(10); 3begin 4// hoge:= null; 5// hoge:= '1234567890' 6 7select 8 * 9from 10 hoge 11where 12 ?? 13 14end;

hoge is nullの場合、where句に指定なし
hoge is not nullの場合、where句に
hogecode = hoge
を含めたいといった場合、どのようにすれば良いでしょうか。

お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2018/10/26 08:53

declare ~ end はPL/SQLです。タグ[PL/SQL]を追加してください。
guest

回答4

0

ベストアンサー

where句では、カラム=nullは検索対象外になります。
つまり、カラム=条件値でis not nullは成立しているのでわざわざ カラム is not nullする必要はありません。
結果的に、カラム=nullは全件検索になるとも
言えるということになります。
つまり、if文などでの制御も不要です。
なんにもしなくても
カラム=nullなら全件、カラム=nullでない値なら検索するという命令が成立しています。

たとえば
(1)where in (select カラム from テーブル名)  
(2)where テーブル名.カラム is not null     
(1)と(2)は、同じ意味になります。
カラムにインデックスがあるなら、(1)がパフォーマンスが高いです。
(2)のようなis not null  やis null  は
全件検索になるためパフォーマンスは悪いです。
しかし、パフォーマンスはデータ量やアクセス件数にも影響するため、影響を考慮するのであれば
(2)のようなis not null  やis null  は
避けた方が良いとは言えます。
しかし、技術的に未熟でも簡単である便利さや
保守に工数を掛けたくない場合には、
(2)のようなis not null  やis null  は
非常に簡単で便利であり
保守による統計情報の分析などで
パフォーマンス悪化を回避することが容易に出来る可能性も外せない事項だとも言えます。
リスクと保守運用を考慮して
どちらを選択するかを検討すれば
一概にどちらが正解でどちらが誤りだと判断することは難しいのだと考えられます。
参考資料:
https://oreno-it.info/archives/1953
否定形のSQLのチューニング方法
例えば、empテーブルのbusyo_cdが10,20,30,40,50,nullのとき、null以外のデータを取得する場合です。
・否定形の場合
select * from emp where busyo_cd is not null;
・否定系をやめた場合
select * from emp where busyo_cd in (10,20,30,40,50)

投稿2023/07/15 08:31

編集2023/07/22 14:40
CO_TOBU

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2023/11/13 04:32

ありがとうございました。
guest

0

selectの結果をどうするのか不明ですので、分岐についてだけ。

性能無視していいなら

SQL

1select * from hoge 2where hogecode = coalesce(:hoge, hogecode) 3;

性能も考慮するなら

SQL

1 if :hoge is null then 2 select * from hoge 3 ; 4 else 5 select * from hoge 6 where hogecode = :hoge 7 ; 8 end if;

投稿2018/10/26 10:57

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

次の質問から使っているテーブルのCREATE TABLE文やデータをINSERT文で提示してください。

SQL

1CREATE TABLE hoge 2 ( 3 hogecode varchar2(10) 4 , hogecode2 varchar2(1) 5 ) ;

SQL

1INSERT INTO hoge(hogecode, hogecode2) VALUES('1234567890', '0') ; 2INSERT INTO hoge(hogecode, hogecode2) VALUES('1234567891', '1') ; 3COMMIT ;

以下、
hoge varchar2(10) := null;
hoge varchar2(10) := '1234567890';
のどちらかを有効にして実行。

SQL

1-- PL/SQL 2SET SERVEROUTPUT ON 3declare 4 hoge varchar2(10) := null; 5-- hoge varchar2(10) := '1234567890'; 6 7 CURSOR CUR_HOGE 8 IS 9 select 10 * 11 from 12 hoge 13 where 14 hoge IS NULL 15 OR hogecode = hoge ; 16begin 17 FOR REC_HOGE IN CUR_HOGE LOOP 18 DBMS_OUTPUT.PUT_LINE(REC_HOGE.hogecode2) ; 19 END LOOP ; 20end; 21/

次の質問の前に
超入門「PL/SQL」 1~5
ここからはじめよう Oracle PL/SQL入門
くらいは勉強してください。

投稿2018/10/26 09:05

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

OR で条件指定するとどうでしょうか。

SQL

1SELECT 2 * 3FROM 4 hoge_table 5WHERE 6 hoge IS NULL 7 OR hogecode = hoge

投稿2018/10/26 08:56

編集2018/10/26 08:57
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問