NULL の取り扱い方
NULL は取り扱い注意!
ご存知の方も多いかもしれませんが、カラムの値が NULL の時の取り扱いの注意点について書いておこうと思います。
ANSI_NULLS オプションについて
ANSI_NULLS は = や <> で値の比較を行う際に、 NULL をどのように取り扱うかを設定する値です。
ANSI_NULLS ON/OFF の各オプションで NULL = NULL を条件に IF 文で分岐した結果は以下のようになります。
ANSI_NULLS が ON の時は NULL = NULL は False, ANSI_NULLS が OFF の時は NULL = NULL が True になっていますね。
データベースを新規作成する際の、ANSI_NULLS デフォルトは OFF ですが、実際 OFF であっても、SQL Server Native Client や、OLE DB を使ってデータベースにつないだ時に、そのコネクションに対して SET ANSI_NULLS で ON に設定される為、実行時には ON になっていることが多いと思います。
以下のトレースは SQL Server Management Stuido から 「新しいクエリー」 をクリックして SELECT * FROM Employee を実行した時の設定です。
また、今後のバージョンでは、ANSI_NULLS は常に ON になり、OFF にするオプションがなくなる予定です。
ANSI_NULLS を OFF にして使っている方は、SQL サーバーをアップグレードする際にはお気をつけください!
NULL Value について
値が NULL である、ということは 値が Unknown である、ということで、空やゼロとは違います。
NULL と NULL や、NULL と他の値を比較しても、結果は unknown で、イコールになることはありません。 ANSI_NULLS を OFF にするとここの比較結果が変わりますが、先ほどお話した通り近い将来できなくなります。
ですので、WHERE 句で、値が NULL かどうかを確認したい際には = や <> ではなく IS NULL や IS NOT NULL を使います。
また、NULL が入る可能性のあるカラムを使って演算をするときは、ISNULL などで NULL の時の値を指定しないと、ひとつでも NULL があると、結果が NULL になってしまいます。
複数に分かれた住所用のカラムを、ひとつにつなげて表示する時なんかにやってしまいがちなミスですね!
その他、気にしておいたほうがいい NULL の動きです。
- ORDER BY でソートすると NULL は一番上にきます。
- BETWEEN や NOT BETWEEN を使う際に、片方の値が NULL の時は、結果が False になります。
- GROUP BY では NULL はひとつの GROUP として集計されます。
- AVG, SUM 等、集計の際には NULL は無視されます。 COUNT(*) だけは NULL かどうかに関係なくレコード数を返します。