NULL属性値の扱い

属性の値が、あるレコードから欠落している場合、その属性はNULLと呼ばれます。たとえば、あるレコードにPrice属性の割当てが含まれていない場合は、EQLはこのPriceの値をNULLと定義します。

次の表は、EQLによるNULL値の扱いを演算のタイプごとにまとめたものです。
演算のタイプ EQLによるNULL値の扱い
算術演算および集計以外の関数 NULL値に対するどのような演算の値もNULLと定義されます。

たとえば、あるレコードではQuantityの値が4でPriceの値がNULLの場合は、Quantity + Priceの値はNULLであると見なされます。

集計関数 EQLは、NULL値を持つレコードを無視します。

たとえば、10個のレコードがあり、そのうち2個のPrice属性の値がNULLの場合は、どの集計演算でもこの2レコードが無視され、かわりに他の8レコードのみを使用して値が計算されます。

10レコードすべてのPriceがNULLの場合は、SUM(Price)などのほとんどの集計では、結果もNULL値になります。

例外はCOUNTCOUNTDISTINCTで、すべてのレコードにNULL値がある場合は0が返されます(つまり、COUNTまたはCOUNTDISTINCTの出力がNULLになることはありません)。ただし、COUNT(1)ではNULL値のレコードはカウントされないことに注意してください。

ブール演算子 「ブール演算子」を参照してください。
グルーピング式 中間結果からグルーピングするときは、EQLはグループ・キーがNULL値のレコードを無視することはなく、そのレコードがグループ内に存在すると見なします。すべてNULLのグループであっても返されます。

コーパスからのグルーピングの場合は、EQLはグループ・キーがNULL値のレコードを無視し、そのレコードはどのグループにも存在しないものと見なします。

フィルタ 特定の値と比較するときは、NULL値は指定されたフィルタの条件に一致しません。ただし、IS NULLフィルタを除きます。
次の点に注意してください。
  • コーパスで直接使用されるフィルタは、中間結果のフィルタと同じセマンティクスを持っています。
  • すべてのフィルタに対して、NOT(x=y)は常にx<>yと等価です。
たとえば、レコードAのpriceが5で、レコードBにはpriceの値がない場合は、次のようになります。
  • WHERE price = 5にはAが一致する
  • WHERE NOT(price <> 5)にはAが一致する
  • WHERE price <> 5にはAもBも一致しない
  • WHERE NOT(price = 5)にはAもBも一致しない
  • WHERE price = 99にはAもBも一致しない
  • WHERE NOT(price <> 99)にはAもBも一致しない
  • WHERE price <> 99にはAが一致する
  • WHERE NOT(price = 99)にはAが一致する
ソート 指定されたソート順序にかかわらず、EQLは次のものを返します。
  1. 通常の結果
  2. NaN値のレコード
  3. NULL値を持つレコード
注意: NULLというキーワードやリテラルはありません。NULLを作成するには、CASEを使用します。たとえば、CASE WHEN False THEN 1 ENDです。