データベースのNULL

データベースのNULL

データベースを扱っていると「NULL」と言うデータを良く見かけます。
データベースの値の初期値もNULLです。

では、データベースのNULLとはどんなものなのでしょうか?

データベースのNULLは空

データベースのNULLは、登録されたデータが空であることを意味しています。
空とは未設定の意味にも取れますが、そこに登録すべき値が無いと言う方が正確だと思います。
なのでデータベースの値の初期値はNULLにしておくことが多いです。

データベースの仕組みでは、どんな値が登録されても何らかの意味を持つ可能性が有ると判断しますが、NULLだけ空の意味しか持たず、「IS NULL」判定の式があります。
NULLは特別なデータです。

データベース システム開発におけるNULLの扱い

更にNULLには空には違いがないのですが、「未知・不明 (Unknown)」 の場合と「適用不能・非存在 (Not Applicable, Inapplicable)」 の場合があります。

例えば、電話番号がNULLの場合
未知・不明のNULLは「電話はあるが番号分からない」
適用不能・非存在のNULLは「電話を持っていない」
の違いがあります。

システム的にはどのように解釈してもシステム内で統一した認識があればよいのですが、例えば、「開発運用初期は000-0000-0000 が入っていた場合、在りえない値なので電話番号を不明として扱う場合に登録しておいた」つもりが、改修の際にNULLでないため実際の値として扱い不具合が出たなど、上の例は極端ですがもっと複雑なデータの場合は往々にして不具合発生の温床となりますので注意が必要です。

NULL を含む演算

NULLを含む演算の結果は、多くがNULLとなります。

売り上げの集計をしていて、一つでもNULLデータが混入していると、結果はNULLとなります。
集計の加算(足し算)だけでなく、客単価等を求めるために割り算などを使った場合も客数がNULLなら結果はNULLになります。

思わぬNULLデータを含む演算による不具合は良く発生するので注意が必要です。

下の結果のようにNULLになります。

NULLを含む演算結果

NULLを取り扱う工夫

思わぬところで不具合が発生してしてしまうNULLですが、なるべくそうならないように工夫することが可能です。

1.テーブルの列に NOT NULL 制約をかける

テーブルの列に NOT NULL制約をかけてしまい、NULLデータを登録(追加・更新)できないようにしてしまう。
追加や更新時にエラーで落ちてしまう不具合が発生するが、エラーハンドリングも取りやすい。

2.適宜 NULL 判定を入れる

isnull関数を使いNULLを妥当な数値やデータに変えます。
妥当性はシステムの性格にもよるので何とも言えないですが、NULL判定を上手く使い予期せぬ不具合を未然に防ぐようにします。

先ほどの演算結果の一部をisnull関数で書き換えてみました。

isnull関数でNULLをチェック
isnull関数でNULLをチェック

このisnull関数の他にもCase文を使ってチェックすることも可能です。
とりあえず例を載せておきます。

Case文を使ってNULLをチェック
Case文を使ってNULLをチェック

NULLの扱いについては「SQL Server NULL」でも少し説明しています。

以上、データベースにおけるNULLについての簡単な説明でした。