SQLにおけるNULL値は「不明」または「存在しない」値を示します。これは特別な振る舞いをします:
=や<>を使用しても常にUNKNOWNを返し、TRUEやFALSEにはなりません。IS NULLまたはIS NOT NULLを使用する必要があります。例:
SELECT * FROM users WHERE name = NULL; -- 行は返されません SELECT * FROM users WHERE name IS NULL; -- 正しい SELECT 1 + NULL; -- 結果:NULL
NULLを置き換えるには、COALESCE(foo, 0)(最初の非NULL値を取得)や、SQL ServerのISNULL(foo, 'default')のような関数を使用します。
質問: WHERE some_column <> 'value'という条件は、some_columnがNULLである行に対してどのような結果を返しますか?
回答:
これらの行では、条件が満たされません:NULLとの比較はUNKNOWNを返し、TRUEにはなりません。したがって、NULLを含む行は選択に含まれません。
例:
-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- NULLを含む行は選択に含まれない
事例
WHERE status <> 'closed'がstatus = NULLの口座(例えば、新しい申請)を考慮しなかったため、アクティブな口座の数が15%少なく計算されてしまった。事例
COALESCE(user_name, '親愛なる顧客')が配信に追加されていなかったため、ほぼ千人の顧客が名前なしで呼びかけを受け取り、自動化のミスと受け取られた。事例
データベースの移行時に、LEFT JOINが予想以上の行を返してしまった。左のテーブルにNULLを持つフィールドが存在し、WHERE b.field = 'X'のフィルターがJOIN後にこれらの行を排除したため、一部のデータが失われてしまった。