SQL未知与NULL相同吗?

问题描述 投票:0回答:3

我很困惑 SQL 中的 UNKNOWN 在 3 值逻辑中意味着什么。它实际上意味着 NULL 吗? NULL 和 UNKNOWN 在所有布尔上下文中是否可以互换?

sql null three-valued-logic
3个回答
9
投票

简单回答:

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?因为在

WHERE
子句中,仅返回表达式计算结果为
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

这不仅仅是为了平等或不平等。对于任何谓词


5
投票

根据维基百科

NULL BOOLEAN 和 UNKNOWN “可以互换使用以表示完全相同的事情”

但是,某些数据库系统实际上并未实现 SQL 的布尔数据类型(它是可选的),并且在大多数这些系统中,您不会在同一上下文中同时遇到

UNKNOWN
NULL
-
UNKNOWN
仅在评估谓词时出现。

您可以使用多种工具来尝试消除

NULL
,例如
COALESCE
IS [NOT] NULL
。其中大多数不能在评估谓词的上下文中使用,因此永远不会与
UNKNOWN
值一起使用。例如。如果您有这样的疑问:

SELECT
    *
FROM
    TableA
WHERE A = 'B'

而且你知道有一些

NULL
A
值会导致
WHERE
子句谓词产生
UNKNOWN
,你不能写:

SELECT
    *
FROM
    TableA
WHERE COALESCE(A = 'B',TRUE)

消除

UNKNOWN


0
投票

SQL-92 指定谓词中真值 TRUE、FALSE 和 UNKNOWN 的三值逻辑(特别是 Kleene 的强三值逻辑)。在实践中,UNKNOWN 可以被认为可能是 TRUE 或 FALSE,并且结论必须适用于任何一种可能性(“强逻辑”)。我认为该标准中的列没有布尔数据类型。

NULL 不是这些真值之一,而是一种特殊标记,具有多种作用,例如缺失数据、N/A 数据和连接中的占位符。

SQL-1999, 4.6还引入了布尔值 数据类型:

布尔数据类型包含不同的真值 truefalse。除非 NOT NULL 约束禁止,否则布尔数据类型还支持 unknown 真值作为 null 价值。该规范没有区分布尔数据的空值 类型和作为 SQL 或 SQL 结果的未知真值 ;它们可以互换使用来表示完全相同的事情。

因此任何谓词或布尔值表达式(例如 WHERE 子句)都可以互换地处理 UNKNOWN 和 NULL。但是,我认为 UNKNOWN 是三值逻辑中的真值,而不是如何处理 NULL。

© www.soinside.com 2019 - 2024. All rights reserved.