1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

なぜ「= NULL」ではなく「IS NULL」と書くのか?(3値理論とNULL)

Last updated at Posted at 2021-09-02

はじめに

  • プログラミングでは真偽値は基本2値(TRUE,FALSE
    • SQLは3値(上記2位加えてunknown)ある
    • なぜか?NULLがいるから

で、本題です。

なぜ「= NULL」ではなく「IS NULL」と書くのか?

最初よくやりがちなSQL、これは失敗します。

SELECT * FROM tests WHERE col_1 = NULL

なぜか?

それは、NULLに比較述語を適用した結果が、常にunknownになるからです。

当然、クエリを実行した結果、出力されるデータはWHERE句の条件評価がtrueになった行のみです。

falseやunknownは選択されません。以下のように、全ての比較述語が同じように動作します。

col_1がどんな値であろうがなんだろうが、NULLと比較した段階でunknownになります。

-- 結果は全てunknown

1 = NULL
2 > NULL
3 < NULL
4 <> NULL
NULL = NULL
NULL > NULL
NULL < NULL
NULL <> NULL

絶対にtrueにはなりません。

なぜ NULLに比較述語を用いた結果が絶対にtrueにならないのか?

それは、NULLが値でも変数でもないからです。

NULLは「そこに値がない」ことを示すマークとか目印です。

仮にNULLが値であるならば、型をもたないといけません。

なぜなら、データベースで扱われる値は全て型を持つからです。

SQL文中の値は対応付けられたデータ型を持っています。

なので、値じゃないNULLは何と比較しても結果はtrueでもfalseでもない、結果が分からないのでunknownとなります。

今後、何度か「3値理論とNULL」について書く予定です。本記事の内容はそれの基本知識になるので覚えておきます。

参照

60 - 64p

アウトプット100本ノック実施中

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?