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

2-1-16 式のリストの比較その1

SQLパズル

ListCompテーブル
a1  b1  c1  a2  b2  c2  a3  b3  c3
--  --  --  --  --  --  --  --  --
 1   2   3   4   5   6   7   8   9
 1   2   1   2   1   1   1   1   2
 1   1   1   1   1   1   2   2   2

a1=a2かつb1=b2かつc1=c2
または
a1=a3かつb1=b3かつc1=c3
かチェックする。

出力結果
a1  b1  c1  a2  b2  c2  a3  b3  c3  chk
--  --  --  --  --  --  --  --  --  ---
 1   2   3   4   5   6   7   8   9  NG
 1   2   1   2   1   1   1   1   2  NG
 1   1   1   1   1   1   2   2   2  OK


データ作成スクリプト

create table ListComp(a1,b1,c1,a2,b2,c2,a3,b3,c3) as
select 1,2,3,4,5,6,7,8,9 from dual union all
select 1,2,1,2,1,1,1,1,2 from dual union all
select 1,1,1,1,1,1,2,2,2 from dual;


SQL

col a1 for 99
col b1 for 99
col c1 for 99
col a2 for 99
col b2 for 99
col c2 for 99
col a3 for 99
col b3 for 99
col c3 for 99

--■■■inを使用しない方法■■■
select a1,b1,c1,a2,b2,c2,a3,b3,c3,
case when (a1,b1,c1) = ((a2,b2,c2))
       or (a1,b1,c1) = ((a3,b3,c3))
     then 'OK' else 'NG' end as chk
from ListComp;

--■■■inを使用する方法■■■
select a1,b1,c1,a2,b2,c2,a3,b3,c3,
case when (a1,b1,c1) in ((a2,b2,c2),(a3,b3,c3))
     then 'OK' else 'NG' end as chk
from ListComp;


解説

要素数が1の集合同士で、等しい、等しくないの演算が使えます
数式のイメージは、ベクトルの等しい、等しくないの定義に似てます。

=および、!=での比較では、
nullとnullは、等しいと判定されないので、注意が必要です。

inを使っての存在チェックもできます。