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

10-124 ブール代数の分配法則

SQLパズル

以下のSQLのcase式のwhen句を
同値変形を使って簡略化する

select ColA,ColB,ColC,
case when ColA = 5
 and not(ColB = 50 or ColC < 3000)
  or ColC < 3000
 and ColB != 50
then 1 else 0 end as "条件式"
from (select 5 as ColA,50 as ColB,2000 as ColC from dual
union select 5,50,4000 from dual
union select 5,99,2000 from dual
union select 5,99,4000 from dual
union select 9,50,2000 from dual
union select 9,50,4000 from dual
union select 9,99,2000 from dual
union select 9,99,4000 from dual);

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


SQL

select ColA,ColB,ColC,
case when ColA = 5
 and not(ColB = 50 or ColC < 3000)
  or ColC < 3000
 and ColB != 50
then 1 else 0 end as "条件式1",
case when ColB != 50 and (ColA = 5 or ColC < 3000)
then 1 else 0 end as "条件式2"
from (select 5 as ColA,50 as ColB,2000 as ColC from dual
union select 5,50,4000 from dual
union select 5,99,2000 from dual
union select 5,99,4000 from dual
union select 9,50,2000 from dual
union select 9,50,4000 from dual
union select 9,99,2000 from dual
union select 9,99,4000 from dual);


解説

条件式 ColA = 5    を A
条件式 ColB = 50   を B
条件式 ColC < 3000 を C
とおきます

すると
ColA = 5
 and not(ColB = 50 or ColC < 3000)
  or ColC < 3000
 and ColB != 50
は
  _____     _
A*(B+C) + C*B
とおけます

ブール代数で同値変形して
  _____     _
A*(B+C) + C*B
  _ _ _
A*B*C+B*C  ドモルガンの法則
_    _
B*(A*C+C)  分配法則
_          _
B*(C+A)*(C+C)  分配法則
_
B*(C+A) 補元法則
_
B*(A+C) 交換法則

よって
ColB != 50 and (ColA = 5 or ColC < 3000)

数の計算の分配法則にない、
ブール代数の分配法則を使ってます
A+B*C = (A+B)*(A+C)