【SQL】3値論理(True/False/Unknown?)
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
したがって、真理表は下記のとおりになります。
| AND | ture | unknown | false |
|---|---|---|---|
| true | true | unknown | false |
| unknown | unknown | unknown | false |
| false | false | false | false |
| OR | true | unknown | false |
|---|---|---|---|
| true | true | true | true |
| unknown | true | unknown | unknown |
| false | true | unknown | false |
| x | NOT x |
|---|---|
| true | false |
| unknown | unknown |
| false | true |
これまでを踏まえて実践編といきましょう。
次のテーブルがあります。
テーブル名(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を含むデータを取り扱う際は、想定と違う結果となることがあります。