トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
7-24 短絡AND
SQLパズル
wkTable
Val1 Val2
---- ----
0 1
2 5
3 30
4 90
5 50
0 9
Val1が、0と等しくなく、かつ、
Val2/Val1が10以上の行を出力する。
出力結果
Val1 Val2
---- ----
3 30
4 90
5 50
データ作成スクリプト
create table wkTable as
select 0 as Val1,1 as Val2 from dual
union select 2,5 from dual
union select 3,30 from dual
union select 4,90 from dual
union select 5,50 from dual
union select 0, 9 from dual;
SQL
--■■■これは0割り除算でエラー■■■
--select Val1,Val2
--from wkTable
--where Val1 !=0
-- and Val2/Val1 >=10;
--■■■これは大丈夫みたいです(保証されませんけど)■■■
select Val1,Val2
from wkTable
where Val2/Val1 >=10
and Val1 !=0;
--■■■インラインビューを使う方法(述語のプッシュをされたらダメっぽい)■■■
select Val1,Val2
from (select Val1,Val2
from wkTable
where Val1 !=0)
where Val2/Val1 >=10;
--■■■case式とドモルガンの法則を使う方法■■■
select Val1,Val2
from wkTable
where case when Not Val1 !=0 then 0
when Not Val2/Val1 >=10 then 0 end is null;
解説
検索case式は、
when句がTrueになったら、後続のwhen句を評価しないので、
短絡ORを実現できますので、ドモルガンの法則と組み合わせてます。
インラインビューを使う方法では、
Val1が0かをインラインビューでチェックしてますが、
述語のプッシュをされたらダメっぽいですねぇ