2011-11-03 52 views
1

查询1转换成整数数组从SQL查询到一个整数数组中的PostgreSQL:如何两个阵列的交叉点的结果

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

标准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
我不确定&运营商在这里做了正确的事情。

+0

Thanks dude ..我喜欢这个回复。他帮我很多.. – Rafiu