集約とNULL - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/tpt1555966086716.ditamap
dita:ditavalPath
ja-JP/tpt1555966086716.ditaval
dita:id
B035-1145
Product Category
Software
Teradata Vantage

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))と同じ結果を出します。