在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