SQL 未知是否与 NULL 相同?

Mic*_*ang 5 sql null three-valued-logic

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

Gio*_*uri 7

简单回答:

3 == 2 => FALSE
3 == 3 => TRUE
NULL == 3 => UNKNOWN
3 == NULL => UNKNOWN
NULL == NULL => UNKNOWN
Run Code Online (Sandbox Code Playgroud)

NULL任一侧或两侧带有的表达式的计算结果为UNKNOWN

例如,如果您有一张桌子:

Employees(id, country)
1, USA
2, USA
3, Canada
4, NULL
Run Code Online (Sandbox Code Playgroud)

假设您的老板要求您选择所有不在美国居住的员工。你写:

select * from Employees
where country <> 'USA'
Run Code Online (Sandbox Code Playgroud)

并得到:

3, Canada
Run Code Online (Sandbox Code Playgroud)

为什么不选择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
Run Code Online (Sandbox Code Playgroud)

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

  • @MichaelTsang - 在 [tag:mysql] 中,“NULL”和“UNKNOWN”被视为相同。正如我在回答中指出的,这在 SQL 数据库系统中绝不是通用的。 (2认同)

Dam*_*ver 5

根据维基百科

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

然而,一些数据库系统实际上并没有实现 SQL 的布尔数据类型(它是可选的),并且在大多数这些系统中,不会出现在同一上下文中同时遇到UNKNOWNs 和s 的情况 - s 仅在评估谓词时出现。NULLUNKNOWN

您可以使用多种工具来尝试消除NULLs,例如COALESCEIS [NOT] NULL。其中大多数不能在评估谓词的上下文中使用,因此永远不会与UNKNOWN值一起使用。例如,如果您有如下查询:

SELECT
    *
FROM
    TableA
WHERE A = 'B'
Run Code Online (Sandbox Code Playgroud)

并且您知道有一些NULL A值会导致WHERE子句谓词产生UNKNOWN,您不能编写:

SELECT
    *
FROM
    TableA
WHERE COALESCE(A = 'B',TRUE)
Run Code Online (Sandbox Code Playgroud)

为了消除UNKNOWN.