SQL unknown 是否与 NULL 相同?
Is SQL unknown identical to NULL?
我很困惑 UNKNOWN 在 SQL 中的 3 值逻辑是什么意思。它实际上意味着 NULL 吗? NULL 和 UNKNOWN 是否可以在所有布尔上下文中互换?
根据Wikipedia:
NULL BOOLEAN and UNKNOWN "may be used interchangeably to mean exactly the same thing"
然而,一些数据库系统实际上并没有实现 SQL 的布尔数据类型(它是可选的)并且在大多数这些系统中,您不会遇到这两种情况 UNKNOWN
s 和 NULL
s 在同一上下文中 - UNKNOWN
s 仅在评估谓词时出现。
您可以使用多种工具来尝试消除 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
.
简单回答:
3 == 2 => FALSE
3 == 3 => TRUE
NULL == 3 => UNKNOWN
3 == NULL => UNKNOWN
NULL == NULL => UNKNOWN
两边或两边带有 NULL
的表达式的计算结果为 UNKNOWN
。
例如,如果您有 table:
Employees(id, country)
1, USA
2, USA
3, Canada
4, NULL
假设您的老板要求您 select 所有不住在美国的员工。你写:
select * from Employees
where country <> 'USA'
并得到:
3, Canada
为什么 4 没有 selected?因为在 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
不只是为了平等或不平等。对于任何 predicate
阅读此文link希望对您有所帮助
我很困惑 UNKNOWN 在 SQL 中的 3 值逻辑是什么意思。它实际上意味着 NULL 吗? NULL 和 UNKNOWN 是否可以在所有布尔上下文中互换?
根据Wikipedia:
NULL BOOLEAN and UNKNOWN "may be used interchangeably to mean exactly the same thing"
然而,一些数据库系统实际上并没有实现 SQL 的布尔数据类型(它是可选的)并且在大多数这些系统中,您不会遇到这两种情况 UNKNOWN
s 和 NULL
s 在同一上下文中 - UNKNOWN
s 仅在评估谓词时出现。
您可以使用多种工具来尝试消除 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
.
简单回答:
3 == 2 => FALSE
3 == 3 => TRUE
NULL == 3 => UNKNOWN
3 == NULL => UNKNOWN
NULL == NULL => UNKNOWN
两边或两边带有 NULL
的表达式的计算结果为 UNKNOWN
。
例如,如果您有 table:
Employees(id, country)
1, USA
2, USA
3, Canada
4, NULL
假设您的老板要求您 select 所有不住在美国的员工。你写:
select * from Employees
where country <> 'USA'
并得到:
3, Canada
为什么 4 没有 selected?因为在 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
不只是为了平等或不平等。对于任何 predicate
阅读此文link希望对您有所帮助