トップページに戻る
次の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)