2012年4月14日土曜日

NULL + 1 > 0 はTRUEかFALSEか

PHPだとTRUE。SQLではUNKNOWNのためTRUEではないのでFALSE。
$ php -r 'echo (null + 1) > 0 ? "TRUE" : "FALSE";'
TRUE

mysql> SELECT IF(NULL + 1 > 0, "TRUE", "FALSE");
+-----------------------------------+
| IF(NULL + 1 > 0, "TRUE", "FALSE") |
+-----------------------------------+
| FALSE                             |
+-----------------------------------+
1 row in set (0.00 sec)
3値論理であることを意識していないSQLを業務でも結構見る。NULLの取扱い方は難しい。
だから僕は、Nullがきらい。
基本的には、NOT NULLにしてnullは排除するように気をつけている。
(例外的に、必須でないけどUNIQUEなカラムは仕方ないのでNULL許すこともあるが)
でも、NOT NULLでNULLを排除していてもNULLは出てくるので困る。そう、外部結合。
NULLを完全に排除なんてできないので、nullについてちゃんと意識してSQLを書こうという今回の教訓。

とりあえず以上。


一応、表題の件を考慮しない失敗例は示しておく。