两个具有 NULL 值的表达式结果之间的差异

Dav*_*542 3 sql postgresql

我很好奇为什么以下两个表达式有不同的结果——一个NULL和另一个TRUE

postgres=# select array[1,null]=array[1,null];
 ?column? 
----------
 t
(1 row)

postgres=# select (1,null)=(1,null);
 ?column? 
----------
 
(1 row)
Run Code Online (Sandbox Code Playgroud)

这是什么原因呢?在你的回答中,你能否链接到 Postgres 中的文档或一些 SQL 参考,其中说明了与NULL内部值进行比较时行和列表类型的行为?

Erw*_*ter 8

如果其他条件都相等,则包含相同位置的数组 比较相等。比较时仅返回null实际值(包括整个null数组值):null

SELECT null::int[] = null::int[];  --> null
Run Code Online (Sandbox Code Playgroud)

对于行比较,Postgres 遵循 SQL 标准。行和数组比较手册:

涉及数组子表达式的形式是 PostgreSQL 扩展;其余的都是 SQL 兼容的。

行构造函数比较手册

=和案例<>的工作方式与其他案例略有不同。如果两行的所有对应成员均非空且相等,则认为两行相等;如果任何相应成员非空且不相等,则行不相等;否则行比较的结果是未知的(null)

大胆强调我的。因此行比较与数组比较略有不同。如果行null值中的嵌套值比较相等(如在数组中),请使用IS NOT DISTINCT FROM而不是=

SELECT (1,null) IS NOT DISTINCT FROM (1,null);  --> true
Run Code Online (Sandbox Code Playgroud)