我很困惑在 3 值逻辑中的 SQL 中 UNKNOWN 意味着什么。它实际上意味着 NULL 吗?NULL 和 UNKNOWN 是否可以在所有布尔上下文中互换?
问问题
5394 次
3 回答
7
简单的回答:
3 == 2 => FALSE
3 == 3 => TRUE
NULL == 3 => UNKNOWN
3 == NULL => UNKNOWN
NULL == NULL => UNKNOWN
NULL
两边或两边都有的表达式计算为UNKNOWN
。
例如,如果您有一张桌子:
Employees(id, country)
1, USA
2, USA
3, Canada
4, NULL
假设您的老板要求您选择所有不住在美国的员工。你写:
select * from Employees
where country <> 'USA'
并得到:
3, Canada
为什么没有选择4?因为 inWHERE
子句只返回表达式计算为的行TRUE
:
1. USA <> 'USA' => FALSE -- don't return this row
2. USA <> 'USA' => FALSE -- don't return this row
3. CANADA <> 'USA' => TRUE -- return this row
4. NULL <> 'USA' => UNKNOWN -- don't return this row
它不仅是为了平等或不平等。对于任何谓词
于 2016-12-16T09:11:10.253 回答
2
根据维基百科:
NULL BOOLEAN 和 UNKNOWN “可以互换使用,表示完全相同的东西”
然而,一些数据库系统实际上并没有实现 SQL 的布尔数据类型(它是可选的),并且在大多数这些系统中,您不会在同一上下文中同时遇到UNKNOWN
s 和s - s 仅在评估谓词时出现.NULL
UNKNOWN
您可以使用各种工具来尝试消除NULL
s,例如COALESCE
或IS [NOT] NULL
。其中大多数不能在评估谓词的上下文中使用,因此永远不会与UNKNOWN
值一起使用。例如,如果您有如下查询:
SELECT
*
FROM
TableA
WHERE A = 'B'
你知道有一些NULL
A
值会导致WHERE
子句谓词产生UNKNOWN
,你不能写:
SELECT
*
FROM
TableA
WHERE COALESCE(A = 'B',TRUE)
要消除UNKNOWN
.
于 2016-12-16T09:09:20.703 回答
1
阅读此链接希望对您有所帮助
于 2016-12-16T09:12:53.113 回答