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

10-105 ブール代数で同値変形

SQLパズル

Sampleテーブル
JPY  LineNo
---  ------
  0  AAAA
  0  SSSS
  0  EEEE
  0  HHHH
  1  AAAA
  1  SSSS
  1  EEEE
  1  HHHH

Sampleテーブルのデータを出力する
ただし、LineNoが'SS','EE','HH'で始まるレコードについては
JPY=0のレコードを除いて出力する。

出力結果
JPY  LineNo
---  ------
  0  AAAA
  1  AAAA
  1  SSSS
  1  EEEE
  1  HHHH

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


データ作成スクリプト

create table Sample(
JPY    number(1),
LineNo char(4));

insert into Sample values(0,'AAAA');
insert into Sample values(0,'SSSS');
insert into Sample values(0,'EEEE');
insert into Sample values(0,'HHHH');
insert into Sample values(1,'AAAA');
insert into Sample values(1,'SSSS');
insert into Sample values(1,'EEEE');
insert into Sample values(1,'HHHH');
commit;


SQL

--■■■ブール代数で同値変形1■■■
select JPY,LineNo
  from Sample
 where not (LineNo Like 'SS%' or LineNo Like 'EE%' or LineNo Like 'HH%')
    or JPY !=0;

--■■■ブール代数で同値変形2■■■
select JPY,LineNo
  from Sample
 where not ((LineNo Like 'SS%' or LineNo Like 'EE%' or LineNo Like 'HH%') and JPY =0);

--■■■正規表現を使用■■■
select JPY,LineNo
  from Sample
 where not (RegExp_Like(LineNo,'^(SS|EE|HH)') and JPY =0);


解説

ブール代数の
交換法則  a+b = b+a
分配法則  a+b*c = (a+b)*(a+c)
補元法則  a+ ¬a = 1
ドモルガン則 ¬a + ¬b = ¬(a*b)
を使って以下の同値変形をしてます。

条件1: LineNoが'SS','EE','HH'で始まる
条件2: JPY=0 である

                条件1 and ¬条件2 or ¬条件1
交換法則     ⇔ ¬条件1 or 条件1 and ¬条件2
分配法則     ⇔ (¬条件1 or 条件1) and (¬条件1 or ¬条件2)
補元法則     ⇔ ¬条件1 or ¬条件2
ドモルガン則 ⇔ ¬(条件1 and 条件2)