Microsoft SQL Server で NULL を 0 として取り扱う

MINI SERIES


NULL値 が含まれていても計算できるようにする

Microsoft SQL Server 2008 で NULL となっているフィールドとの演算を行うと、計算結果が NULL として出力されます。

これは、Microsoft SQL Server に限らず、Oracle や PostgreSQL, MySQL 等の一般的なデータベースのほとんどに該当する仕様のようですけど、NULL が入る可能性がある項目を利用して演算を行いたいような場合には都合が悪い場合があります。

 

 そんなときには、Microsoft SQL Server の場合は ISNULL という関数を利用することで、項目が NULL だった場合に使用する値を指定することが可能です。

ISNULL(フィールド名, 代替値)

このようにすることで、"フィールド名" に指定された値が NULL でなければ実際の値が、NULL であれば "代替値" が取得できるようになります。

"フィールド名" と "代替値" はどのような型でも良いとのことですが、両方とも同一の型か、少なくとも "代替値" が暗黙的に "フィールド名" に設定されている型に変換できる必要があります。

 

これを利用すると、例えば NULL の入らない "サイズ" と NULL が入る可能性のある "拡大" の積(掛け算)を計算したい場合で、"拡大" が NULL の場合には 1 として扱いたい場合には、次のようにすることで計算を行うことが可能です。

SELECT [サイズ] * ISNULL([拡大], 1) FROM [アイテムテーブル]

 

補足

調べていたときには SUM による総和や AVG による平均を算出する際にも、NULL が入っていると都合が悪いので "SELECT SUM(ISNULL([項目], 0)) FROM [テーブル]" のようにするという情報がありました。

ただ、Microsoft SQL Server 2008 で試してみた限りでは、NULL が入っていたとしても "SELECT SUM([項目]) FROM [テーブル]" のような形で、"ISNULL" を使わなくても "ISNULL([項目], 0)" を使ったときと同じ結果が得られるようでした。

もっとも、SUM で集計する値が "値1 + 値2" というような場合には、どちらかが NULL だと "値1 + 値2" が NULL として扱われるため、ISNULL を利用したときとそうでないときとで計算結果に差がでてきます。

そのような感じから考えると、関数の名前の通りですが、ISNULL 関数は計算のために必要というよりは、値が NULL だった場合にどうするかを指定する関数と思っておけば良さそうです。

 

ちなみに Oracle データベースでは、ISNULL に該当する関数として "NVL(フィールド名, 代替値)" というものがあるようです。

 

また、指定したリストの中から NULL ではない最初の値を返す COALESCE という関数もあります。ちなみに読み方は "コーアレス" といった雰囲気になります。

これを利用することで、ISNULL 関数と同じ書式で同じ効果を得ることが可能です。

COALESCE(フィールド名, 代替値)

このようにすることで、最初に指定した "フィールド名" が NULL だった場合には "代替値" が取得されます。

この関数は PostgreSQL や MySQL、Oracle 等の一般的なデータベースで利用することが出来る様子です。Microsoft SQL Server でも利用することができるので、場合によってはもしかすると ISNULL よりも COALESCE で覚えておいた方が、いろいろなデータベースシステムを扱う場合には混乱しなくて良いかもしれないです。