ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 比較述語とNULL① 非中律が成立しない

排中律(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);