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

10-175 少なくとも1つがnullかをチェック

SQLパズル

ValTable
ColA  ColB  ColC  ColD  ColE  ColF  ColG
----  ----  ----  ----  ----  ----  ----
   1     1     1     1     1     1     1
   1     1     1     1  null     1     1
   1     2     1     1     1     1     1
   1  null     1  null     1  null     1
null  null  null  null  null  null  null

ColA,ColB,ColC,ColD,ColE,ColF,ColG
の少なくとも1つがnullの行かをチェックし、
ExistsNull列に、その結果(ExistsもしくNotExists)を表示する。

出力結果
ColA  ColB  ColC  ColD  ColE  ColF  ColG  ExistsNull
----  ----  ----  ----  ----  ----  ----  ----------
   1     1     1     1     1     1     1  NotExists
   1     1     1     1  null     1     1  Exists
   1     2     1     1     1     1     1  NotExists
   1  null     1  null     1  null     1  Exists
null  null  null  null  null  null  null  Exists

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table ValTable(
ColA number(1),
ColB number(1),
ColC number(1),
ColD number(1),
ColE number(1),
ColF number(1),
ColG number(1));

insert into ValTable values(   1,   1,   1,   1,   1,   1,   1);
insert into ValTable values(   1,   1,   1,   1,null,   1,   1);
insert into ValTable values(   1,   2,   1,   1,   1,   1,   1);
insert into ValTable values(   1,null,   1,null,   1,null,   1);
insert into ValTable values(null,null,null,null,null,null,null);
commit;


SQL

col ColA for 99999
col ColB for 99999
col ColC for 99999
col ColD for 99999
col ColE for 99999
col ColF for 99999
col ColG for 99999
col ExistsNull for a15

--■■■greatest関数を使う方法■■■
select ColA,ColB,ColC,ColD,ColE,ColF,ColG,
case when greatest(ColA,ColB,ColC,ColD,ColE,ColF,ColG) is null
     then 'Exists' else 'NotExists' end as ExistsNull
  from ValTable;

--■■■Least関数を使う方法■■■
select ColA,ColB,ColC,ColD,ColE,ColF,ColG,
case when Least(ColA,ColB,ColC,ColD,ColE,ColF,ColG) is null
     then 'Exists' else 'NotExists' end as ExistsNull
  from ValTable;

--■■■orで論理和を求める方法■■■
select ColA,ColB,ColC,ColD,ColE,ColF,ColG,
case when ColA is null
       or ColB is null
       or ColC is null
       or ColD is null
       or ColE is null
       or ColF is null
       or ColG is null
     then 'Exists' else 'NotExists' end as ExistsNull
  from ValTable;


解説

greatest関数とLeast関数は、
引数に1つでもnullがあると、
nullを返すことを使ってます。

nullの有無判定で、全称命題と存在命題を考えると、

少なくとも1つがnullである。 ⇔  Least(ColA,ColB,・・・) is null
全てnullである。 ⇔  coalesce(ColA,ColB,・・・) is null

となります。

ColAとColBでデータ型が違う場合は、
Least関数を使わずに、orで論理和を求めるほうが無難でしょう。
(coalesce関数では、データ型が違うと、ORA-00932エラーとなります)

2-1-4 連続したnullチェック