トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

2-2-11 case式とLNNVL述語

SQLパズル

BoolTable
Val1  Val2
----  ----
   1     9
   9     9
   9     1
null     1
   1  null

Val1とVal2を比較し、Val1 < Val2がtrueでなければ(unknownかfalseであれば)1、
Val1とVal2を比較し、Val1 < Val2がfalseでなければ(unknownかtrueであれば)1、
を取得する。

出力結果
Val1  Val2  IsNotTrue  IsNotFalse
----  ----  ---------  ----------
   1     9          0           1
   9     9          1           0
   9     1          1           0
null     1          1           1
   1  null          1           1


データ作成スクリプト

create table BoolTable(Val1,Val2) as
select    1,   9 from dual union
select    9,   9 from dual union
select    9,   1 from dual union
select null,   1 from dual union
select    1,null from dual;


SQL

--■■■LNNVL述語で判定する方法(10g以降)■■■
select Val1,Val2,
case when LNNVL(Val1  < Val2) then 1 else 0 end as IsNotTrue,
case when LNNVL(Val1 >= Val2) then 1 else 0 end as IsNotFalse
from BoolTable;

--■■■case式で判定する方法■■■
select Val1,Val2,
case when Val1  < Val2 then 0 else 1 end as IsNotTrue,
case when Val1 >= Val2 then 0 else 1 end as IsNotFalse1,
case when not(Val1 < Val2) then 0 else 1 end as IsNotFalse2
from BoolTable;


解説

LNNVL述語で判定する方法では、
Val1  < Val2がfalseであることは、
Val1 >= Val2がtrueであることと同値であるというロジックを使ってます。

LNNVL述語は、
引数となった条件が、trueだとfalse
引数となった条件が、falseだとtrue
引数となった条件が、unknownだとtrue
を返します。

LNNVL述語の引数に、andやorなどの論理演算は使えないようです。
LNNVL述語は、is not true述語の弱体版といえるでしょう。

case式やLNNVL述語を使えば
is not true述語や
is not false述語を模倣できます。

8-2 case式でis not falseを模倣
10-155 is not trueとis not falseを模倣

マニュアル(LNNVL述語)(英語)
マニュアル(LNNVL述語)

3値論理の資料
3値論理の資料
3値論理の資料

BOOLEAN型の資料