如何将两个数组的交集结果转换​​为整数数组,从SQL查询转换为postgresql中的Integer数组

时间:2011-11-03 15:04:10

标签: arrays postgresql rails-postgresql

查询1:

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

为什么会有差异?

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

1 个答案:

答案 0 :(得分:2)

标准PostgreSQL不支持ARRAY交叉运算符。您必须已安装additional module 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]

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

这可能非常令人困惑。例如,请参阅此帖子关于how to treat string_to_array() with empty output 我不确定&运算符在这里做了正确的事。