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

确定如下:
案例:

  • 如果XV或YV为空值,则

    xy

    这是未知的

  • 否则,

    案例:

    >P>如果XV和YV的声明类型是n次行类型,则让席,1(一)≤ 我≤ N 表示其值和声明类型为XV和的第i个字段的值和声明类型的 让Yi表示a,其值和声明的类型是YV的第i个字段的值和声明的类型。
    结果

    xy

    确定如下:

  • 当且仅当(Xi=Yi)对某些i为真时,X=Y为假
  • 当且仅当X=Y为真或Y
  • 如果xy既不是真的也不是假的,那么xy是未知的
  • 如果XV和YV的声明类型分别是基数为N1和N2的数组类型, 然后让席,1(一)≤ 我≤ N1,表示其值和声明类型为 让Yi表示其值和声明的类型 是YV的第i个元素。结果

    xy

    确定如下:

  • 如果N1=0(零)和N2=0(零),则X=Y为真
  • 当且仅当N1时,X=Y为假≠ 对于某些i,N2与否(Xi=Yi)是正确的
  • 如果xy既不是真的也不是假的,那么xy是未知的
  • 这是相当令人困惑的,例如,我没有看到规范hoz wo将数组与相等运算符以外的其他运算符进行比较

    该标准有时也会自相矛盾

    *=
    运算符只存在于
    记录中,不存在于数组中。它的作用与
    =
    几乎相同,但效率更高,因为如果值的长度不同,它不会“detoast”值

    最好是接受语义的原样

    PostgreSQL在这方面似乎没有遵循标准


    NULL本身就令人困惑,在复合或数组中更是如此。

    非常感谢。我询问的目的是确定我是否可以依赖这样一个事实,即我可以从一组数组值中获得所需的布尔比较结果,即使如果这些值不在数组中,例如如果在unnest()之后在行上下文中求值,我也会得到未知的结果。正如您所发现的,结果会有所不同。