SQL或PostgreSQL规范中有什么解释了数组与原语的比较?
我想了解为什么在数组中可以将空值作为相等值进行比较,但不能作为基本值进行比较 例如,以下查询演示了:SQL或PostgreSQL规范中有什么解释了数组与原语的比较?,sql,postgresql,null,Sql,Postgresql,Null,我想了解为什么在数组中可以将空值作为相等值进行比较,但不能作为基本值进行比较 例如,以下查询演示了: SELECT NULL = NULL AS does_not_equal , NULL::bool = NULL::bool AS does_equal , NULL::int = NULL::int AS does_equal , NULL::text = NULL::text AS does_equal , ARRAY[NULL] = ARRAY[N
SELECT NULL = NULL AS does_not_equal
, NULL::bool = NULL::bool AS does_equal
, NULL::int = NULL::int AS does_equal
, NULL::text = NULL::text AS does_equal
, ARRAY[NULL] = ARRAY[NULL] AS does_equal
, ARRAY[NULL]::bool[] = ARRAY[NULL]::bool[] AS does_equal
, ARRAY[NULL]::int[] = ARRAY[NULL]::int[] AS does_equal
, ARRAY[NULL]::text[] = ARRAY[NULL]::text[] AS does_equal
;
我理解为什么NULL=NULL对于原语是NULL的,我也理解为什么比较复合类型会对其中的字段进行真正的比较,这两个字段的两边都是NULL,主要是因为*=运算符查看类型的二进制值。但是数组似乎没有使用*=运算符,到目前为止,我在搜索中还没有找到任何解释它的方法。我找不到您描述的行为的文档。但是,对于记录构造函数和行构造函数,
NULL
s被认为是相等的,对此有明确的解释:
SQL规范要求行比较在以下情况下返回NULL
结果取决于比较两个空值或一个空值和一个空值
非空。在使用两个复合类型值的其他上下文中
比较后,两个空字段值被视为相等,一个空字段值被视为相等
被认为大于非空值
数组不是复合类型。似乎正在使用类似的逻辑。这是一个复杂的故事 以下是SQL标准(ISO/IEC 9075-2)在第8.2节中所说的内容 “: 设XV和YV是分别由sx和Y表示的两个值。结果:
xy
确定如下:案例:
xy
这是未知的结果
xy
确定如下:
xy
确定如下:
*=
运算符只存在于记录中,不存在于数组中。它的作用与=
几乎相同,但效率更高,因为如果值的长度不同,它不会“detoast”值
最好是接受语义的原样
PostgreSQL在这方面似乎没有遵循标准
NULL本身就令人困惑,在复合或数组中更是如此。非常感谢。我询问的目的是确定我是否可以依赖这样一个事实,即我可以从一组数组值中获得所需的布尔比较结果,即使如果这些值不在数组中,例如如果在unnest()之后在行上下文中求值,我也会得到未知的结果。正如您所发现的,结果会有所不同。