かなめのロジック

フリーSEの雑記ブログ。ORACLEやPostgreSQL、情報セキュリティ、金融について主に書いています。

NULLの動作仕様に注意

time 2016/04/04

NULLの動作仕様に注意

プログラマを何かと悩ませるNULL、扱いを誤ったために障害となることもあります。
そして、ORACLEにおいてもNULLは存在し、動作仕様に注意が必要です。

本記事では、この悩ましいNULLの動作仕様について、まとめました。

sponsored link

ORACLEにおけるNULL

ORACLEを始めとするデータベースのNULLは、その項目がカラであることを指します。

具体的には、以下の2つのパターンでNULLとして設定します。
未知/不明…例.性別がよく分からない個人客の顧客マスタの性別項目
適用不能/非存在…例.法人客の顧客マスタの性別項目

いずれしろ、そのNULLの取り扱いには注意が必要になります。

NULLの取り扱いで注意すべき点

比較する際に、通常の比較演算子が使えない

比較を行う際に通常であれば、等しいかどうかを検査する際は【=】を使用しますし、等しくないかどうかを検査する際は【<>】や【!=】を使用します。

しかし、NULLを上記で比較するとUNKNOWN(不明)となり対象外となります。

NULLかどうかを検査する場合には【IS NULL】を使用し、NULL以外かどうかを検査する場合には【IS NOT NULL】を使用します。

インデックスが効かない

上記のようにWHERE句でNULLかどうか評価した場合、インデックスが効きません。

それはインデックスは、NULL以外のデータを対象として構成されているためです。

演算で結果がNULLになる

NULLが一部に含まれた演算を行うと、結果もNULLになります。

標準関数の戻り値が想定と異なることも

ORACLEの標準関数も、NULLが引数で渡した際に、関数によって動作が異なるので、想定と異なってしまうことが考えられます。

例えば、文字列の長さを戻すLENGTHは、引数としてNULLを渡すとNULLを戻します。(0ではない)
また、文字列を連結するCONCATは、2つの引数が両方ともNULLの場合はNULLを戻しますが、どちらか一方がNULL以外の場合は、その値を戻します。

まとめ

悩ましいNULLの動作仕様について、細かく見てきました。

比較の際に【IS NULL】を使用しなければならないと知っている方も多いと思います。
しかし、本来NULLは入らないはずなので考慮しなかったことで障害となったり、インデックスが効かないことを知らなかったためにパフォーマンス障害となったりすることは、よく聞きます。

NULLの取り扱い、注意しましょう。

関連

sponsored link

管理人

かなめ

フリーの業務系システムエンジニア。情報処理安全確保支援士。 ORACLEと金融と子育ての狭間で、元気に楽しくやってます。 [詳細]

管理人twitter

ブログ村



sponsored link