2009-04-16 1559 views
18

在postgresql中,如果两个数组具有公共成员(即它们重叠),则可以使用运算符返回t(true)。是否有一个函数/运算符返回这些常用成员的内容?Postgres - 函数返回2个数组的交集?

即是这样的

select arrray_intersection(ARRAY[1, 4, 2], ARRAY[2, 3]); 
ARRAY[2] 

回答

14

尝试的&代替&&

更多见PostgreSQL Docs

+3

经过测试,无法正常工作,您需要安装一个扩展才能使其正常工作。但无论如何+1。 – 2009-04-16 16:27:12

+1

http://www.postgresql.org/docs/current/static/contrib.html#需要在这里读取数据 – 2009-04-16 16:29:13

4
SELECT ARRAY 
     (
     SELECT a1[s] 
     FROM generate_series(array_lower(a1, 1), array_upper(a1, 1)) s 
     INTERSECT 
     SELECT a2[s] 
     FROM generate_series(array_lower(a2, 1), array_upper(a2, 1)) s 
     ) 
FROM (
     SELECT array['two', 'four', 'six'] AS a1, array['four', 'six', 'eight'] AS a2 
     ) q 

也适用于非整数数组。

3

您可以使用此功能:

CREATE OR REPLACE FUNCTION intersection(anyarray, anyarray) RETURNS anyarray as $$ 
SELECT ARRAY(
    SELECT $1[i] 
    FROM generate_series(array_lower($1, 1), array_upper($1, 1)) i 
    WHERE ARRAY[$1[i]] && $2 
); 
$$ language sql; 

应该与任何类型的数组的工作,你可以使用它像这样:

SELECT intersection('{4,2,6}'::INT4[], '{2,3,4}'::INT4[]); 
39

Since 8.4, there are useful builtins in Postgres这使得the function from the first answer更容易和可能更快(这就是EXPLAIN告诉我的,无论如何:“(cost = 0.00..0.07 rows = 1 width = 64)”对于这个查询与原始版本的“(cost = 0.00..60.02 rows = 1 width = 64)”) 。

简化代码:

SELECT ARRAY 
    (
     SELECT UNNEST(a1) 
     INTERSECT 
     SELECT UNNEST(a2) 
    ) 
FROM (
     SELECT array['two', 'four', 'six'] AS a1 
       , array['four', 'six', 'eight'] AS a2 
    ) q; 

,是的,你可以把它变成一个功能:

CREATE FUNCTION array_intersect(anyarray, anyarray) 
    RETURNS anyarray 
    language sql 
as $FUNCTION$ 
    SELECT ARRAY(
     SELECT UNNEST($1) 
     INTERSECT 
     SELECT UNNEST($2) 
    ); 
$FUNCTION$; 

,你可以调用作为

SELECT array_intersect(array['two', 'four', 'six'] 
        , array['four', 'six', 'eight']); 

,但你可以只以及在线称之为:

SELECT array(select unnest(array['two', 'four', 'six']) intersect 
       select unnest(array['four', 'six', 'eight'])); 
2

彼此方法..

SELECT ARRAY(SELECT * FROM UNNEST($1) WHERE UNNEST = ANY($2)); 
3

如果你不介意安装的延伸,intarray extension提供&运营商这样做,因为@dwc指出:

SELECT ARRAY[1, 4, 2] & ARRAY[2, 3]; 

返回{2}