NULL 比较搜索条件

NULL 值表示列的数据值未知或不可用。NULL 值与零(数值或二进制值)、零长度的字符串或空白(字符值)的含义不同。相反,空值可用于区分输入的是零(数值列)或空白(字符列)还是无数据输入(NULL 可用于数字列和字符列)。

可以通过以下两种方式在允许空值的列中输入 NULL 值(根据 CREATE TABLE 语句中的指定):

  • 如果无数据输入并且列或数据类型无默认值或 DEFAULT 约束,SQL Server 将自动输入值 NULL。

  • 用户可以通过键入不带引号的 NULL 显式输入 NULL 值。如果在字符列中键入带引号的 NULL,则它将被视为字母 N、U、L 和 L,而非空值。

当检索到空值时,应用程序通常会在相应的位置显示诸如 NULL、(NULL) 或 (null) 的字符串。例如,Product 表中的 Color 列允许空值:

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

比较空值

比较空值时必须小心。比较行为取决于 SET ANSI_NULLS 选项的设置。

当 SET ANSI_NULLS 为 ON 时,如果比较中有一个或多个表达式为 NULL,则既不输出 TRUE 也不输出 FALSE,而是输出 UNKNOWN。这是因为未知值不能与其他任何值进行逻辑比较。这种情况发生在一个表达式与 NULL 单词进行比较,或者两个表达式相比,而其中一个表达式取值为 NULL 时。例如,当 ANSI_NULLS 为 ON 时,以下比较总是生成 UNKNOWN:

ytd_sales > NULL

只要变量包含 NULL 值,下列比较也生成 UNKNOWN:

ytd_sales > @MyVariable

使用 IS NULL 或 IS NOT NULL 子句测试 NULL 值。这将增加 WHERE 子句的复杂性。例如,表 AdventureWorks2008R2Customer 中的 TerritoryID 列允许空值。如果 SELECT 语句不仅用于测试其他值,还用于测试空值,则该语句必须包括 IS NULL 子句:

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

Transact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE。通过设置 ANSI_NULLS OFF 可将此选项激活。当 ANSI_NULLS 为 OFF 时,如果 ColumnA 包含 Null 值,则 ColumnA = NULL 之类的比较操作会返回 TRUE;如果 ColumnA 除了包含 NULL 外还包含某些值,则这类比较操作将返回 FALSE。比较计算结果为 NULL 的两个表达式也会返回 TRUE。ANSI_NULLS 设置不影响包含 NULL 的联接列。联接列中包含 NULL 的行不是结果集的一部分。当 ANSI_NULLS 设置为 OFF 时,以下 SELECT 语句返回 Customer 表中 Region 为 Null 值的所有行:

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

不论 ANSI_NULLS 如何设置,对于 ORDER BY、GROUP BY 和 DISTINCT 关键字,空值总被视为相等。此外,允许 NULL 的唯一索引或 UNIQUE 约束只能包含一个具有 NULL 键值的行。后面具有 NULL 的行将被拒绝。属于主键的任何列中都不能含有 NULL。

涉及 NULL 的计算均取值为 NULL,这是因为只要有一个因子未知,结果肯定是 UNKNOWN。例如,如果 column1 为 NULL,则 column1 + 1 计算为 NULL。

当搜索的列中包括定义为允许 Null 值的列时,可以通过以下模式查找数据库中的 Null 值或非 Null 值:

WHERE column_name IS [NOT] NULL

请参阅

参考

概念