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 的行为引起的。必须小心避免这些问题。
在 SQL 中,在搜索条件中与 NULL 进行比较将得到 UNKNOWN 结果。但是,当确定两行是否是彼此的复制时,SQL 会将 NULL 视为等同于 NULL。这些语义应用到 WINDOW 子句中的集合运算符(UNION、INTERSECT、EXCEPT)、GROUP BY、PARTITION,以及 SELECT DISTINCT。
例如,在表 T1 的所有行中名为 redundant 的列的值均为 NULL,则下面的语句将返回一个单独的行:
SELECT DISTINCT redundant FROM T1; |
必须连接到数据库。
无。
SQL/2008 核心功能。
Transact-SQL 在有些环境中,Adaptive Server Enterprise 处理 NULL 值比较的方式有所不同。如果使用等于或不等于将 expression 与变量或 NULL 值比较,并且如果 expression 是引用基表或视图的列的简单表达式,则会使用两值逻辑执行比较,而且 NULL = NULL 将得到 TRUE 而不是 UNKNOWN。使用这些语义的可能比较列表及其 SQL/2008 等效项如下所示:
Transact-SQL 比较 | SQL/2008 等效项 |
---|---|
expression = NULL | expression IS NULL |
expression != NULL | NOT (expression IS NULL) |
expression = variable | expression = variable IS TRUE OR (expression IS NULL AND variable IS NULL) |
expression != variable | expression != variable IS TRUE AND ( NOT expression IS NULL OR NOT variable IS NULL) |
如果 ansinull 选项设置为 OFF,则 SQL Anywhere 将实现这些语义以匹配 Adaptive Server Enterprise 行为。缺省情况下,Open Client 和 jConnect 连接将 ansinull 选项设置为 OFF。为确保 SQL/2008 语义,可以将 ansinull 选项重设为 ON,或者使用 IS [NOT] NULL 谓语代替相等比较。
SQL Anywhere 中的唯一索引可以包含带有 NULL 且其它值相同的行。而 Adaptive Server Enterprise 中的唯一索引不允许这样的条目。
如果使用 jConnect,则 tds_empty_string_is_null 选项将控制返回的空字符串是作为 NULL 字符串,还是作为包含一个空白字符的字符串。
以下 INSERT 语句将一个 NULL 值插入到表 Borrowed_book 的 date_returned 列中。
INSERT INTO Borrowed_book ( date_borrowed, date_returned, book ) VALUES ( CURRENT DATE, NULL, '1234' ); |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |