2014-07-09

[MySQL]nullの扱いについてプログラマ1年生レベルのことも分かっちゃいなかった


 スーパーこっぱずかしいが恥を忍んで書く




カラムの値がnullのレコードを取得するには、どんなwhere句を書けばいいだろうか?


考えるまでもない。

where column is null

= 演算子で null と比較してはいけない。(ヒットしない)

where column = null 



では、in条件のときはどうだろうか

今回、自信満々にこのような条件を書いて爆死した。。。
= でなく is null を使う背景まで正しく理解していなかったのがサムいところ。

where column in (1, 2, null)

正しくはこう書く。

where (column in (1, 2) or column is null)



MySQL - NULL値の問題

MySQLリファレンスマニュアル:NULL 値の問題
SQL では、NULL 値は、他の値と比較すると(NULLでも)常に偽になります。

NULL を含む式は、演算子と式に含まれている関数のドキュメントに特に断りがなければ、常に NULL 値を生成します。以下の例では、全カラムが NULL を返します。

mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);

NULL のカラム値を検索したい場合、=NULL テストは使用できません。
どんな式でも expr = NULL は偽。

↑の公式リファレンスのほか、以下の記事が大変参考になる。
MySQL のNULL ではまったことあれこれ
そもそもNULL は何を意味するか
NULL との比較演算結果は常にNULL
NULL と論理演算子
NULL とインデックス
NULL とソート
NULL と集計
TIMESTAMP とNULL




まとめ

プログラマやってると時々
「いままでコレを知らずによく生きてこれたな」っていうのがある。

もう一度初心に返ってブラインドタッチ北斗の拳からやり直そうと思う。