トップページに戻る    次の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かをインラインビューでチェックしてますが、
述語のプッシュをされたらダメっぽいですねぇ