NULL 比較検索条件

NULL 値は、その列のデータ値が不明であるか、利用できないことを示します。NULL は、0 (数値またはバイナリ値)、長さが 0 の文字列、または空白 (文字値) ではありません。むしろ、NULL 値によって、入力された 0 (数値型列) または空白 (文字型列) と、入力なし (数値型列および文字型列共に NULL) が区別されることになります。

NULL は、CREATE TABLE ステートメントで NULL 値が許容されることが指定された列に 2 つの方法で入力されます。

  • データが入力されず、その列またはデータ型に対して既定値や DEFAULT 制約もない場合は、SQL Server によって自動的に NULL 値が入力されます。

  • ユーザーは明示的に NULL 値を入力できます。NULL は引用符を付けずに入力してください。引用符を付けて NULL を文字列に入力すると、NULL 値ではなく、文字 N、U、L、および L であると見なされます。

NULL 値を取得する場合、通常は NULL、(NULL)、または (null) などの文字列が適切な位置に表示されます。たとえば、Product テーブルの Color 列では NULL 値が許容されています。

USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL

NULL 値の比較

NULL 値を比較する場合は注意が必要です。比較操作は、SET ANSI_NULLS オプションの設定によって異なります。

SET ANSI_NULLS を ON にすると、比較する式の 1 つ以上が NULL の場合、TRUE または FALSE ではなく、UNKNOWN が返されます。認識できない値はそれ以外の値と論理的に比較できないためです。これは、式をリテラル NULL と比較するか、2 つの式を比較しどちらか一方が NULL と評価された場合に発生します。たとえば、ANSI_NULLS を ON にした場合、次の比較では、必ず UNKNOWN が返されます。

ytd_sales > NULL

次の比較も、変数に NULL 値が含まれていると、必ず UNKNOWN が返されます。

ytd_sales > @MyVariable

IS NULL 句または IS NOT NULL 句は、NULL 値があるかどうかを調べるのに使用します。ただし、これを使用すると WHERE 句は複雑になります。たとえば、AdventureWorks2008R2Customer テーブルの TerritoryID 列では NULL 値が許容されています。SELECT ステートメントで特定の値の他に NULL 値の有無も調べるには、IS NULL 句を使用する必要があります。

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
   OR TerritoryID IS NULL

Transact-SQL は、NULL 値について比較した後に TRUE または FALSE を返す比較演算子の拡張機能をサポートしています。このオプションは、ANSI_NULLS を OFF にするとアクティブになります。ANSI_NULLS を OFF にした場合、ColumnA = NULL などの比較は、ColumnA が NULL 値であれば TRUE を、ColumnA が NULL 以外の値であれば FALSE を返します。また、2 つの式がどちらも NULL 値と評価された場合は TRUE が返されます。ANSI_NULLS 設定は、NULL を含む結合列に影響しません。NULL を含む結合列の行は、結果セットには含まれません。ANSI_NULLS を OFF に設定した場合、次の SELECT ステートメントは、Customer テーブルで Region が NULL 値の行をすべて返します。

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL

ORDER BY、GROUP BY、および DISTINCT の各キーワードでは、ANSI_NULLS の設定とは無関係に、NULL 値はどれも等しいと見なされます。NULL を許容する一意インデックスまたは UNIQUE 制約では、NULL キー値を持つ行が 1 行だけ認められます。それ以降の NULL を含む行は拒否されます。主キーでは、キーの一部であるどの列にも NULL は許容されません。

NULL を含む場合の計算結果は NULL になります。因数の 1 つでも UNKNOWN であれば結果も UNKNOWN になるためです。たとえば、column1 + 1 は、column1 が NULL であれば結果も NULL になります。

検索する列が、NULL 値を許容するように定義されている場合、データベース内の NULL 値または NULL 以外の値は次のパターンで検索することができます。

WHERE column_name IS [NOT] NULL

関連項目

参照

概念