我很好奇为什么下面的两个表达式有不同的结果--一个是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
值进行比较时,行和列表类型的行为?
2条答案
按热度按时间qq24tv8q1#
数组 * 包含 *
null
在相同的位置(S)比较相等,如果所有其他都是平等的。比较时,只有实际的null
值(包括数组值 * 作为一个整体 *)返回null
:字符串
对于行比较,Postgres遵循SQL标准。The manual on Row and Array Comparisons:
涉及数组子表达式的形式是PostgreSQL扩展;其余的都是SQL兼容的。
=
和<>
的工作方式与其他情况略有不同。如果两行的所有对应成员都非空且相等,则认为它们相等;如果任何对应的成员非空且不相等,则行是不相等的;否则行比较的结果未知(null)。大胆强调我的。所以行比较与数组比较有细微的不同。如果行值中的嵌套
null
值比较起来相等(如数组中),则使用IS NOT DISTINCT FROM
而不是=
:型
wsxa1bj12#
来源:https://git.postgresql.org/cgit/postgresql.git/tree/src/backend/utils/adt/arrayfuncs.c#n3760
解释第一个查询
select array[1,null]=array[1,null];
3784-3787比较两个数组基本元素数据类型。
3790-3793两个数组维度/边界信息检查。
3796-3813检查天气数组基类型是否具有相等功能。某些数据类型没有相等函数。3825-3828为两个阵列建立迭代。
3838-3853,对于数组中的每个基本元素,为Datum或null。因此迭代并复制datum或null(datum(非null)或null中一个元素)到变量(it 1,isnull 1,it 2,isnull 2)。
你在第3845行和第3848行回答。
src/backend/utils/adt/arrayfuncs.c
字符串