集計でNullをどのように評価するか
Nullは値を持たないので、集計関数のSUM()
、AVG()
、MIN()
、およびMAX()
ではNullは無視されます。本来は、0などのデフォルト値を設定し、計算でNullの問題が起きないようにするのが最善の方法です。しかし、集計で0が評価されることが目的にかなわない場合もあります。SQL Serverには、この点に関して多少役に立つ機能があります。次のオプションをオンにするだけで、Null値を除外するときに、SQL Serverから警告のメッセージを出すことができます。
SET ANSI_WARNINGS ON
ただし、SET ANSI_WARNINGS ON
の設定は、SQL Serverでのゼロ除算、算術オーバーフロー、および文字/バイナリデータの切り捨ての処理方法にも影響を与えるので、その影響が及ぶ範囲を知っておく必要があります。重要な違いは、Nullをどのような値に加えてもNullが返され、集計関数ではNullを除外してその規格を回避するということです。
すべての値を評価したい場合は、デフォルト値を適用し、テーブルレベルで値を計上する必要があります。これができない場合は、COALESCE()
を使って、式でNull以外の値を返します。例えば、図7に示す最初のAVG()
関数では、Null値が評価されていません。しかし、2番目の関数ではNull値が評価されています。厳密に言うと、2番目の関数ではNull値ではなく0が評価されています。どちらのステートメントの方がよいということはありません。関数でNullを無視するかどうかは、その目的によって決まります。
COUNT()
関数は次の2種類の形式を持ち、他の4つの集計関数とは少し異なります。
COUNT(column)
-columnのNull値を除いて、テーブル内の行数を返す。COUNT(*)
-テーブル内の行数を返す。
図8に示すように、次の形式では同じ結果が返されます。
SELECT COUNT(*) - Count(column) AS NullCount SELECT COUNT(*) AS NullCount FROM tbl WHERE column IS NULL
しかし、次のようにcolumnを指定した場合、ステートメントは0を返します。
SELECT COUNT(column) AS NullCount FROM tbl WHERE column IS NULL
これは、COUNT(column)
では評価の前にすべてのNullが除外されるからです。このため、Null値を数えても0になります。
Null値を許可するのであれば、対処する必要がある
データベースにNull許容型の列が1つでもあるなら、Null値がデータにどのように影響するかを考慮する必要があります。SQL ServerでNull値がどのように評価されるかを理解し、それに対処する方法を知ることによって、Nullによるデータへの影響を防ぐことができます。