我正在尝试在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或其他技术来实现这一目标。
有什么想法吗?
提前致谢。
答案 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建议的内容。