我很好奇为什么以下两个表达式有不同的结果——一个NULL和另一个TRUE:
postgres=# select array[1,null]=array[1,null];
 ?column? 
----------
 t
(1 row)
postgres=# select (1,null)=(1,null);
 ?column? 
----------
 
(1 row)
这是什么原因呢?在你的回答中,你能否链接到 Postgres 中的文档或一些 SQL 参考,其中说明了与NULL内部值进行比较时行和列表类型的行为?
如果其他条件都相等,则包含相同位置的数组 比较相等。比较时仅返回null实际值(包括整个null数组值):null
SELECT null::int[] = null::int[];  --> null
对于行比较,Postgres 遵循 SQL 标准。行和数组比较手册:
涉及数组子表达式的形式是 PostgreSQL 扩展;其余的都是 SQL 兼容的。
=和案例<>的工作方式与其他案例略有不同。如果两行的所有对应成员均非空且相等,则认为两行相等;如果任何相应成员非空且不相等,则行不相等;否则行比较的结果是未知的(null)。
大胆强调我的。因此行比较与数组比较略有不同。如果行null值中的嵌套值比较相等(如在数组中),请使用IS NOT DISTINCT FROM而不是=:
SELECT (1,null) IS NOT DISTINCT FROM (1,null);  --> true
| 归档时间: | 
 | 
| 查看次数: | 107 次 | 
| 最近记录: |