2009-04-16 51 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}