Postgresql在n个数组中找到交叉点

时间:2012-12-28 23:52:00

标签: postgresql postgresql-9.2

  

可能重复:
  Intersection of multiple arrays in PostGreSQL

我正在尝试在Pg 9.2数据库中识别多个(> 2)数组中的公共元素。数据结构如下:

ID标题数组
1 title1 {a,b,c,d,...}
2 title2 {z,y,a,d,...}
3 title3 {d,a,p,q,...}
n ...... ...

从上面的例子中,SELECT应该返回{a,d}作为每个数组的公共元素。

我使用以下方法将2个数组用作测试用例:

...
选择array_agg(e)
来自(
    从cte_1中选择unfst(arr1)     相交
    从cte_2中选择unfst(arr2) )作为dt(e)),
...

但是还没有能够使用RECURSIVE CTE正常工作。在线和各种Joe Celko书籍/片段中找到了一些有用的例子。

我能想出的最好的是这篇文章使用自定义函数:

Intersection of multiple arrays in PostgreSQL

但似乎应该有一种方法可以通过RECURSIVE或其他技术来实现这一目标。

有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您只需要无空int[]之间的交集,这可能会有用。对不起,如果不是这样,但你没有在你的问题中说清楚。

CREATE EXTENSION intarray;

SELECT ARRAY[1,2,3]::int[] & ARRAY[3,4,5]::int[] & ARRAY[1,3,5,7]::int[] as intersection;
intersection 
--------------
{3}
(1 row)

这是完整的intarray contrib module documentation

修改Here's a similar question可能有用的答案。我会先尝试用户depesz建议的内容。