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']));
Протестировано, не работает на складе, вам необходимо установить расширение, чтобы оно работало. но +1 в любом случае. –
http://www.postgresql.org/docs/current/static/contrib.html # необходимо прочитать данные здесь –
Good catch, Kent – dwc