17.10 - 集約とNULL - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL関数、式、および述部

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1145-171K-JPN
Language
日本語 (日本)

COUNT(*)以外の集約は、すべての計算でnullを無視します。

UDT列の値がNULLになるのは、NULLに設定された属性をUDTインスタンスが持っている場合ではなく、列に明示的にNULLを入れた場合だけです。

nullを無視すると、明らかに過渡的ではない異常な結果になることがあります。例えば、列Aまたは列B (あるいはその両方)にNULLがあると、実際に、次の式は、必ず真になります。

   SUM(A) + SUM(B) <> SUM(A+B) 

ただし、列AとBの両方の値が同じ行にあってNULLである場合は、例外です。その場合には、行の全体が集約において無視されるからです。これは、一般ルールに違反しないようなささいな例です。

より正式にいえば、フィールドAとフィールドBの両方がnullである場合にだけ、いずれかのフィールドにnullが現われるたびに上記の不等条件がfalseになります。

この動作を示す例については、結果のタイプと属性の「例: Nullとして返される社員」および「例: 部署に割り当てられていない社員のカウント」を参照してください。集約は確実に所定どおりに動作していて、結果は算術的に異常にならないことに注意する必要があります。

この明らかに過渡的ではない問題が現われた場合には、解決する手段がいくつかあります。次のいずれかの解決方法では、一定の同じ結果が得られます。
  • 必ず、数値列をNOT NULL DEFAULT 0として定義します。
  • 集約関数の中でZEROIFNULL関数を使用して、計算のためにNULLをゼロに変換します。例えば、SUM(ZEROIFNULL(x) + ZEROIFNULL(y))は、SUM(ZEROIFNULL(x) + SUM(ZEROIFNULL(y))と同じ結果を出します。