【SQL】3値論理(True/False/Unknown?)

【SQL】3値論理(True/False/Unknown?)
Photo by Growtika / Unsplash

SQLには、ture, false だけでなく、unknownを含む3つの真理値があります。

なぜ、unknownが含まれるかという理由については、リレーショナルデータベースにNULLが存在するからです。NULLは、そこに値がないことを意味する記号であり、値ではありません。

値ではないので、下記の条件式は比較ができず、すべてunknownとなります。

1 = NULL
1 <> NULL
1 > NULL
1 < NULL
NULL = NULL
...

次に、true、false、unkownの力関係は下記のとおりです。
【ANDの場合】 false > unknown > true
【 ORの場合】 true > unknown > false

したがって、真理表は下記のとおりになります。

ANDtureunknownfalse
truetrueunknownfalse
unknownunknownunknownfalse
falsefalsefalsefalse


ORtrueunknownfalse
truetruetruetrue
unknowntrueunknownunknown
falsetrueunknownfalse


xNOT x
truefalse
unknownunknown
falsetrue

これまでを踏まえて実践編といきましょう。
次のテーブルがあります。

テーブル名(three-valued-logic)

カラム名(name, gender)
データ
name gender
一条 1
二木 0
三矢 1
七草 NULL
四葉 0

ここで、次のSQL文を実行した結果はどうなるでしょう?

SELECT COUNT(*)
FROM `three-valued-logic`
WHERE gender = 1 OR gender <> 1;

正解は 4 でした。
結果に反映されるレコードは、WHERE句がtrueになるときです。
「七草」の場合、WHERE句はWHERE NULL = 1 OR NULL <> 1となります。
NULLは値ではないので、下記の結果になります。

WHERE NULL = 1 OR NULL <> 1
→ WHERE unknown OR unknown 
→ WHERE unknown

つまり、WHERE句がtrueにならないので、七草はカウントされないのです。
それでは、WHERE NULL = 1 OR NULL <> 1の部分を残しつつ、
七草をカウントに含めるにはどうすればよいでしょうか?

正解は下記のとおりです。

SELECT COUNT(*)
FROM `three-valued-logic`
WHERE gender = 1 OR gender <> 1 OR gender IS NULL;

このように、NULLを含むデータを取り扱う際は、想定と違う結果となることがあります。