Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语言元素

 

NULL 值

NULL 值指定了未知或不适用的值。

语法
NULL
注释

NULL 是一个特殊值,它不同于任何数据类型的任何有效值。然而,NULL 值在任何数据类型中都是合法值。NULL 用于表示缺少或不适用的信息。NULL 有两种截然不同的使用情况:

情况 说明
缺少 字段具有值,但该值未知。
不适用 字段不适用于特定的行。

SQL 允许在创建列时带有 NOT NULL 限制。这意味着那些特殊的列不能包含 NULL。

NULL 值将三值逻辑的概念引入 SQL。NULL 值通过任何比较运算符与任何值(包括 NULL 值)进行比较时都是"UNKNOWN"。返回 TRUE 的唯一搜索条件是 IS NULL 谓语。在 SQL 中,只有 WHERE 子句中搜索条件的值为 TRUE 时才选择行;不选择值为 UNKNOWN 或 FALSE 的行。

NULL 值的列空间占用率是每列 1 位,而分配的空间是 8 位的整数倍。在允许 NULL 值的表中,NULL 位的占用在列数的基础上是固定不变的。

IS [ NOT ] truth-value 子句(其中 truth-value 是 TRUE、FALSE 或 UNKNOWN 中的一个)可用于选择包含 NULL 值的行。有关此子句的说明,请参见搜索条件

以下示例中,列 Salary 包含 NULL。

条件 真值 是否选择?
Salary = NULL UNKNOWN NO
Salary <> NULL UNKNOWN NO
NOT (Salary = NULL) UNKNOWN NO
NOT (Salary <> NULL) UNKNOWN NO
Salary = 1000 UNKNOWN NO
Salary IS NULL TRUE YES
Salary IS NOT NULL FALSE NO
Salary = expression IS UNKNOWN TRUE YES

同样的规则也适用于比较两个不同表中的列。因此,将两个表连接到一起不会选择其所比较的任何一列含有 NULL 值的行。

用于数字表达式时,NULL 还有一个有趣的属性。任何涉及 NULL 值的数字表达式的结果都为 NULL。这意味着,如果将 NULL 加上一个数字,结果为 NULL,而不是数字。如果想将 NULL 视为 0,则必须使用 ISNULL( expression, 0 ) 函数。

公式化 SQL 查询时的很多常见错误是由 NULL 的行为引起的。必须小心避免这些问题。有关组合搜索条件时三值逻辑的作用的说明,请参见搜索条件

设置运算符和 DISTINCT 子句

在集合操作(UNION、INTERSECT、EXCEPT)和 DISTINCT 操作中,会针对不同的搜索条件对 NULL 进行不同的处理。包含 NULL 而其余列均相同的行在此类操作中被视为相同。

例如,在表 T1 的所有行中名为 redundant 的列的值均为 NULL,则下面的语句将返回一个单独的行:

SELECT DISTINCT redundant FROM T1;
权限

必须连接到数据库。

副作用

无。

标准和兼容性
  • SQL/2003   核心特性。

  • Sybase   在有些环境中,Adaptive Server Enterprise 将 NULL 按值处理,而 SQL Anywhere 不是这样。例如,在 SQL Anywhere 中,使用以下 WHERE 子句所查询的结果中不包括 c1 列中为 NULL 的行,因为条件的值为 UNKNOWN:
    WHERE NOT( C1 = NULL )

    在 Adaptive Server Enterprise 中,条件的值为 TRUE,因此返回这些行。为了兼容,应该使用 IS NULL 而不是比较运算符。

    SQL Anywhere 中的唯一索引可以包含带有 NULL 且其它值相同的行。而 Adaptive Server Enterprise 中的唯一索引不允许这样的条目。

    如果使用 jConnect,则 tds_empty_string_is_null 选项将控制返回的空字符串是作为 NULL 字符串,还是作为包含一个空白字符的字符串。

    有关详细信息,请参见tds_empty_string_is_null 选项 [数据库]

另请参见
示例

以下 INSERT 语句将一个 NULL 值插入到表 Borrowed_book 的 date_returned 列中。

INSERT INTO Borrowed_book ( date_borrowed, date_returned, book )
VALUES ( CURRENT DATE, NULL, '1234' );