“
1 + NULL = NULL
2 - NULL = NULL
3 * NULL = NULL
4 / NULL = NULL
NULL / 0 = NULL
というように、演算結果も問答無用で NULL に化けてしまいます。最後の例から分かるように、0除算の場合ですらエラーになりません。 SQL 関数の多くも、NULL に対しては NULL を返す仕様になっています。この現象を「NULL は伝播する(NULLs propagate)」と言います。propagate という単語は、「(雑草が)はびこる」のように負のニュアンスを持って使われることもあり、NULL の厄介者ぶりを表すにはぴったりの表現です。
意外と知られていない、あるいは注意を払われていないのが、4.と5.の理由ではないでしょうか。正直、この2点については、ホスト言語やDBMSの実 装次第というところもあり、今後解消されていく可能性は大いにあります。しかしホスト言語が関係モデルにおける NULL をサポートしていない現時点では、やはり大きな問題です。Oracle では空文字と NULL は区別されないが Visual Basic では区別されるという現状がまかり通っている以上、NULL 排除の十分な理由となります。”
- NULL撲滅委員会
なぜNULLがそんなに悪いのか
NULL が悪いとされる理由は、一般的に以下の5点によります。- SQL の作成にあたり、人間の直観に反する3値論理を考慮せねばならない。
- IS NULL、IS NOT NULL を指定する場合、インデックスが参照されないためパフォーマンスが悪い。
- 四則演算または SQL 関数の引数に NULL が含まれると「NULL の伝播」が起こる
- SQL の結果を受け取るホスト言語において、NULL の組み込み方が標準化されていない。
- 通常の列の値と違って、NULL は行のどこかに余分なビットを持つことで実装されている。そのため記憶領域を圧迫したり、検索パフォーマンスを悪化させる。
1 + NULL = NULL
2 - NULL = NULL
3 * NULL = NULL
4 / NULL = NULL
NULL / 0 = NULL
というように、演算結果も問答無用で NULL に化けてしまいます。最後の例から分かるように、0除算の場合ですらエラーになりません。 SQL 関数の多くも、NULL に対しては NULL を返す仕様になっています。この現象を「NULL は伝播する(NULLs propagate)」と言います。propagate という単語は、「(雑草が)はびこる」のように負のニュアンスを持って使われることもあり、NULL の厄介者ぶりを表すにはぴったりの表現です。
意外と知られていない、あるいは注意を払われていないのが、4.と5.の理由ではないでしょうか。正直、この2点については、ホスト言語やDBMSの実 装次第というところもあり、今後解消されていく可能性は大いにあります。しかしホスト言語が関係モデルにおける NULL をサポートしていない現時点では、やはり大きな問題です。Oracle では空文字と NULL は区別されないが Visual Basic では区別されるという現状がまかり通っている以上、NULL 排除の十分な理由となります。”
- NULL撲滅委員会