我很好奇为什么下面这两个表达式的结果不同--一个是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进行比较时?

推荐答案

如果其他条件相同,则处于相同位置(S)的数组containingnull比较相等.进行比较时,只有实际的null值(包括数组值as a whole)才返回null:

SELECT null::int[] = null::int[];  --> null

对于row comparison,Postgres遵循SQL标准.The manual on Row and Array Comparisons:

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

The manual on Row Constructor Comparison:

=个和<>个 case 的工作原理与其他 case 略有不同.二 如果行的所有对应成员都是 非空且等于;如果有任何对应的成员,则行是不相等的 是非空的且不相等的;otherwise the result of the row comparison is unknown (null).

Bold重点是我的.因此,行比较与数组比较略有不同.如果行值中嵌套的null个值比较相等(如数组中),则使用IS NOT DISTINCT FROM而不是=:

SELECT (1,null) IS NOT DISTINCT FROM (1,null);  --> true

Sql相关问答推荐

创建每小时重置的序列号

通过 Select 值的顺序进行排序ClickHouse

为什么在这种情况下我不能使用LAG函数?

retrofit AWS Athena中的JSON

计算分段的总权重

部分匹配表中元素的MariaDB查询查找结果

我希望以正确的升序获取SQL结果.怎样才能得到它们?

在SQL Server中设置关联对象的有效JSON格式

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

如何在Postgres中为单值输入多行?

无法访问级联删除导致的触发器中已删除的外键记录

从给定数据中查找下一个工作日期

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

如何在 SQL Server 中解决这个复杂的窗口查询?

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

如何将输出转换为二维格式?

计数时如何为所有时间间隔返回 0 而不是什么都不返回

条件前置值

SQL 查询以填充单个列中的所有值