IS NULL 和 IS NOT DISTINCT FROM NULL 之间有区别吗?

4

value IS NULLvalue IS NOT DISTINCT FROM NULL有什么区别?

每个SQL方言都一样吗?


如果valueNULL,那么第一个返回“true”,第二个返回“false”。它们完全不同。 - Gordon Linoff
“每个 SQL 方言都一样吗?” - 据我所知,Postgres 是唯一支持标准 is distinct 运算符的 DBMS。因此,答案是否定的。 - user330315
@a_horse_with_no_name 哎呀!正确的写法是漏了 NOT - Art
2个回答

4
IS NOT DISTINCT FROM谓词是SQL标准(SQL:2003)的一部分。
然而,并非所有的DBMS都已经完全采用了它。
实际上,只有少数...嗯,PostgreSql已经采用了它。

你可以把它看作是“NULL容忍相等”。

比较:

(1 = 1)  --> true
(1 = 0)  --> false
(1 = null) --> unknown/null
(null = null) --> unknown/null

(1 IS NULL) --> false
(null IS NULL) --> true

(1 IS NOT DISTINCT FROM 1) --> true
(1 IS NOT DISTINCT FROM 0) --> false
(1 IS NOT DISTINCT FROM null)  --> false
(null IS NOT DISTINCT FROM null)  --> true

所以IS NULLIS NOT DISTINCT FROM的主要区别是什么?基本上,IS NULL用于检查元素是否为空。而IS NOT DISTINCT FROM用于比较两个元素。
如果在WHERE子句中使用,则会变成这样:
WHERE (x IS NOT DISTINCT FROM y)

有一个标准的SQL替代方案:

WHERE (x = y OR (x IS NULL AND y IS NULL))

请注意,本答案中提出的标准SQL替代方案并不在所有用例中等同于IS NOT DISTINCT FROM。如果x为1且y为空,则替代方案将返回null,而不是false。这在WHERE子句中是可以接受的(因为WHERE null与WHERE false的效果相同),但是在SELECT子句中,提出的替代方案将不等同于IS NOT DISTINCT FROM。 - Christian Long
这是一个完整的替代方案,它在所有情况下返回True或False,并且从不返回未知/空值:((x不为空且y不为空且x = y) 或者 (x为空且y为空)) - Christian Long

2

这些测试之间存在微妙的差异,可以进行比较。

SELECT ROW(NULL, NULL) IS NOT DISTINCT FROM NULL;

并且

SELECT ROW(NULL, NULL) IS NULL;

2
IS [NOT] DISTINCT FROM 是 SQL 标准的一部分,而不是 Postgres 的扩展。 - user330315
@laurenz-albe,您能否解释一下为什么这两个示例会产生不同的结果?这些结果的差异有何意义? - Art
这没有太多意义。复合类型和NULL是标准委员会可能服用了错误药物的地方之一。我只是想指出这些表达式并不完全相同。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接