匹配两个数组列postgresql-9.4-

时间:2016-02-18 07:19:31

标签: sql arrays database postgresql-9.4

在同一行;

Array column 1 has {2,4,5} value  
Array column 2 has {4,8,9} value  

我想要做的是查询一个表中的行,这些行中的两个数组列中至少有一个数字匹配上面的示例;第4号提供此匹配。

我如何查询,当然对于表中每一行的每两个数组列?我想选择匹配2个数组列的行。

1 个答案:

答案 0 :(得分:0)

如果您安装了intarray扩展程序,这变得很简单,您可以使用&运算符来获取两个数组之间的交集:

with data (col1, col2) as (
  values 
    (array[3,4,5], array[4,8,9]), 
    (array[1,2,3,4], array[6,5,1]),
    (array[1,2,3,4], array[7,8,9,10]) 
)
select col1 & col2
from data 
where cardinality(col1 & col2) > 0;

返回:

common_elements
---------------
{4}            
{1}            

修改

要在没有扩展名或使用bigint数组的情况下执行此操作,您可以将两个列都替换为集合,然后在这些集合上执行交集。这需要表格上的主键(或唯一)列(您没有提到)

with data (id, col1, col2) as (
  values 
    (1, array[3,4,5]::bigint[], array[4,8,9]::bigint[]), 
    (2, array[1,2,3,4]::bigint[], array[6,5,1]::bigint[]),
    (3, array[1,2,3,4]::bigint[], array[7,8,9,10]::bigint[]) 
)
select id, array_agg(element) as elements
from (
  select id, unnest(col1) as element
  from data 
  intersect
  select id, unnest(col2)
  from data
) t
group by id;

返回:

id | elements
---+---------
 1 | {4}
 2 | {1}