■排中律(excluded middle) とは
「命題とその否定を「または」でつなげて作成される命題は全て真である」
という命題を2値倫理で排中律と呼ぶ
【排中律の具体例】
ジョンは20歳か、(または)20歳でないかどちらかである
■SQLでは排中律は成立しない
以下SQLのジョンはNULLを含む比較ではunknownとなるため抽出されない
--年齢が20歳か、20歳でない生徒を選択せよ SELECT * FROM students WHERE age = 20 OR age <> 20;
【考察】
ジョンの行は次のようなステップを踏んで評価される
--1.ジョンは年齢がNULL(未知のNULL!) SELECT * FROM students WHERE age = NULL OR age <> NULL;
--2.比較述語にNULLを適用するとunknown になる SELECT * FROM students WHERE unknown OR unknown;
--3.[unknown OR unknown]はunkown になる SELECT * FROM students WHERE unknown;
■解答
SQLで選択結果に含まれるのは、trueに評価される行のみ。
ジョンを結果に含めるには以下のような「第3の条件」を含める必要がある。
--第3の条件を追加:「年齢が20歳か,20歳でないか,または年齢がわからない」 SELECT * FROM students WHERE age = 20 OR age <> 20 OR age IS NULL;
テストデータ作成用SQL
/* 実践編:1. 比較述語とNULL その1:排中律が成立しない */ CREATE TABLE Students (name VARCHAR(16) PRIMARY KEY, age INTEGER ); INSERT INTO Students VALUES('ブラウン', 22); INSERT INTO Students VALUES('ラリー', 19); INSERT INTO Students VALUES('ジョン', NULL); INSERT INTO Students VALUES('ボギー', 21);