行值表达式和 NULL 断言

Tags: database

行值表达式是 SQL 中非常强大的功能。因为标准SQL的初期,他们已经出现了,比如:SQL 1992,即使不是所有的数据库正确实现这个功能,直到今天。

与往常一样,理解 NULL 断言始终都有点棘手,尤其在值表达式上下文中。看看下面的表达式:

(A, B) IS NULL
(A, B) IS NOT NULL

SQL 1992 是这样定义的

8.6 通用规则 1) 假设 R 是 .的值 2) 如果 R 的所有值都为 null,那么 "R 是 true" 否则 "R 是 false" 3) 如果 R 的所有值都不为 null,那么 "R IS NULL" 为 true 否则为 false

注意:对于所有的 R,"R IS NOT NULL" 和 "R IS NULL" 有相同的返回值,当且仅当 R 是一阶的。表格 12, "\<null predicate> semantics", 定义了这个行为。

注意规则 3,是的,下面两个断言结果是不相同的:

(A, B) IS NOT NULL
NOT((A, B) IS     NULL)

当理解了相等的规则后,这很容易理解

(A, B) IS NOT NULL                -- 等价于...
A IS NOT NULL AND B IS NOT NULL   -- 等价于...
NOT(A IS NULL) AND NOT(B IS NULL) -- 等价于...
NOT(A IS NULL OR B IS NULL)

-- whereas...
NOT((A, B) IS NULL)               -- 等价于...
NOT(A IS NULL AND B IS NULL)

真值表很好的记录了上面的结论

+----------------+-------+-------------+------------+--------------+
|                | R IS  | R IS NOT    | NOT R IS   | NOT R IS NOT |
| Expression     | NULL  | NULL        | NULL       | NULL         |
+----------------+-------+-------------+------------+--------------+
| degree 1: null | true  | false       | false      |  true        |
| degree 1: not  | false | true        | true       |  false       |
| null           |       |             |            |              |
| degree > 1:    | true  | false       | false      |  true        |
| all null       |       |             |            |              |
| degree > 1:    | false | false       | true       |  true        |
| some null      |       |             |            |              |
| degree > 1:    | false | true        | true       |  false       |
| none null      |       |             |            |              |
+----------------+-------+-------------+------------+--------------+

本文链接:http://www.4byte.cn/learning/37791/xing-zhi-biao-da-shi-he-null-duan-yan.html