在postgresql中,如果兩個數組具有公共成員(即它們重疊),則可以使用運算符返回t(true)。是否有一個函數/運算符返回這些常用成員的內容?Postgres - 函數返回2個數組的交集?
即是這樣的
select arrray_intersection(ARRAY[1, 4, 2], ARRAY[2, 3]);
ARRAY[2]
在postgresql中,如果兩個數組具有公共成員(即它們重疊),則可以使用運算符返回t(true)。是否有一個函數/運算符返回這些常用成員的內容?Postgres - 函數返回2個數組的交集?
即是這樣的
select arrray_intersection(ARRAY[1, 4, 2], ARRAY[2, 3]);
ARRAY[2]
嘗試的&
代替&&
更多見PostgreSQL Docs。
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
也適用於非整數數組。
您可以使用此功能:
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[]);
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']));
彼此方法..
SELECT ARRAY(SELECT * FROM UNNEST($1) WHERE UNNEST = ANY($2));
經過測試,無法正常工作,您需要安裝一個擴展才能使其正常工作。但無論如何+1。 – 2009-04-16 16:27:12
http://www.postgresql.org/docs/current/static/contrib.html#需要在這裏讀取數據 – 2009-04-16 16:29:13