読者です 読者をやめる 読者になる 読者になる

転職した

調べた事、学んだ事、思った事、考えた事を個人的にまとめているだけなので内容は保証しないYO!

SQLのNULLはなぜIS NULLで比較するのか

今年度に入ってから(毎年度のことだが)ろくな仕事がなく、新人にいらんことを色々吹き込んでいる。

課題としてOracleの資格取得を命ぜられているらしいので、たまに質問に答えるついでに、NULLを許可すると色々面倒だからNOT NULLつけとか*1、サングラスをかけた人の眼の色と自動車の眼の色の話をしたりとか*2、なぁなぁで仕事してるとまず行き着かない話をしている。

そんな中で出てきた質問が、「なぜNULLはIS NULLで比較しなければならないのか」という質問。なんと答えたかは後述するけど、そのまえに3値論理でこのことに言及されていたので引用する。

理由は、NULL に「=」を適用した結果が必ず unknown になるからです 

 

以下、遠回りに上記の一文を説明しているだけだけど、皆さんの新人教育の参考になれば幸い。

yellowringなりの「なぜNULLはIS NULLで比較しなければならないか」に対する回答(面倒なので実際に新人に説明した感じの話口調)

まず、NULL = col では1行も結果が返らないことについての説明から。

NULLというのはサングラスをかけた人の眼の色(未知)か自動車の眼の色(適用不能)なわけだけど、例えば「タモリと同じ眼の色の人はこのオフィス内に何人いる?」と質問されたら、なんて答える? 「わからない」だよね。タモリの眼の色がわからない、わからない物とわかっている物を比較しても一緒かどうかなんてわかりようがない。逆に「タモリと違う眼の色の人はこのオフィス内に何人いる?」という質問に対しても「わからないと答えざるを得ない。一緒かどうかわからないのだから、違っているのかどうかもやはりわからない。だから、NULL = colもNULL <> colも結果が0件になってしまうわけだ。

次にNULL = NULLについてサングラスをかけた人の眼の色の例を当てはめてみよう。

(適当に画像検索したサングラスをかけた人の画像を見せて)「タモリの眼の色とこの人の眼の色は一緒ですか?」と質問されたら、なんて答える? これも同じく「わからない」だよね。わからない物とわからない物を比較して一緒かどうかなんてわからない。だから、NULL = NULLではNULLを検索することができない。

これの回避策として、「xxxは未知ないし適用不能ですか?」という演算子が必要となったわけだ。そして、それがIS NULLというわけさ。