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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア7
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア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
総合スコア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
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。