メインコンテンツまでスキップ
に最終更新

NULL

NULL の基本​

行の列に値がない場合、その値は NULL と呼ばれます。NULL は "NOT NULL" 制約が指定されていない列に格納できます。実際の値が不明な場合や、値に意味がない場合に NULL を使用します。

数値のゼロや空文字列を表すために NULL を使用しないでください。これらは同じものではありません。

NULL を含む算術式の結果は常に NULL になります。たとえば、NULL に 10 を加えても結果は NULL です。実際、すべての演算子はオペランドとして NULL を受け取ると NULL を返します。

関数の引数としての NULL​

NULL を引数として渡すと、ほとんどの集約関数は NULL を返します。NULL 値が現れたときに別の値を返すには、IFNULL 関数を使用できます。たとえば、式 IFNULL(arg, 0) は、arg が NULL の場合は 0 を返し、NULL でない場合は arg の値を返します。各関数の具体的な動作については、「関数」セクションを参照してください。

NULL と比較演算子​

NULL かどうかを判定するには、比較条件 IS NULL と IS NOT NULL のみを使用できます。NULL に依存する条件の結果は UNKNOWN になります。NULL は欠損データを表すため、どの値とも、別の NULL とも、等しいまたは等しくないと判定することはできません。

比較可能な場面(内部の値が NULL であるネスト型の比較など)では、NULL は常に、その型で表現できるどの値よりも小さいとみなされます。つまり、自身を除くどの値よりも小さくなります。

select array(null) < array(-1), array(null) > array(-1);
+-------------------------+-------------------------+
| array(null) < array(-1) | array(null) > array(-1) |
+-------------------------+-------------------------+
| 1 | 0 |
+-------------------------+-------------------------+

select array(cast("nan" as double)) > array(null);
+--------------------------------------------+
| array(cast("nan" as double)) > array(null) |
+--------------------------------------------+
| 1 |
+--------------------------------------------+

select array(cast("inf" as double)) > array(null);
+--------------------------------------------+
| array(cast("inf" as double)) > array(null) |
+--------------------------------------------+
| 1 |
+--------------------------------------------+

条件式における NULL​

UNKNOWN と評価される条件は、ほぼ FALSE と同じように扱われます。たとえば、WHERE 句の条件が UNKNOWN と評価される SELECT 文は行を返しません。ただし、UNKNOWN と評価される条件と FALSE と評価される条件には違いがあります。UNKNOWN と評価された結果にさらに演算を行っても、結果は UNKNOWN になります。そのため、NOT FALSE の計算結果は TRUE ですが、NOT UNKNOWN の計算結果は UNKNOWN です。

次の表は、条件式で NULL を使用した場合のさまざまな評価例を示します。SELECT 文の WHERE 句で UNKNOWN と評価される条件を使用すると、クエリは行を返しません。

条件式A の値評価結果
a IS NULL10FALSE
a IS NOT NULL10TRUE
a IS NULLNULLTRUE
a IS NOT NULLNULLFALSE
a = NULL10UNKNOWN
a != NULL10UNKNOWN
a = NULLNULLUNKNOWN
a != NULLNULLUNKNOWN
a = 10NULLUNKNOWN
a != 10NULLUNKNOWN