2

查询一:

SELECT ARRAY(select id from contacts where id = 0)::INT[],
       ARRAY[]::INT[],
       ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[] = ARRAY[]::int[]

产生这个结果:

int4    array   ?column?                                                                    
{}      {}      TRUE

查询 2:

SELECT (ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]
      & ARRAY(select id from contacts where id = 0)::INT[]),
        ARRAY[]::INT[],
       (ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]
      & ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]) = ARRAY[]::int[]

产生不同的结果:

?column?    array   ?column?                                                            
{}              {}      FALSE

为什么有区别?

有没有其他方法可以将空整数数组与第二个查询中的两个数组相交的结果进行比较?

4

1 回答 1

2

标准 PostgreSQL 不支持 ARRAY 交集运算符。您必须已安装附加模块intarray

您的问题归结为:
两个空整数数组的交集产生一个空整数数组。为什么这个查询会产生false

SELECT ('{}'::int[] & '{}'::int[]) = '{}'::int[]

或者在其他语法中,含义相同:

SELECT (ARRAY[]::int[] & ARRAY[]::int[]) = ARRAY[]::int[]

虽然这会产生true

SELECT '{}'::int[] = '{}'::int[]

是的,这是一个很好的问题


对于它的价值,我可以解释其中的区别

SELECT array_dims('{}'::int[])
<NULL>

SELECT array_dims('{}'::int[] & '{}'::int[])
[1:0]

换句话说,第一个只是一个空数组,而第二个是一个空元素的一维数组。

这可能非常令人困惑。例如,请参阅this thread about how to Treat string_to_array() with empty output
我不确定&操作员在这里做对了。

于 2011-11-03T15:50:08.087 回答