Начиная с 8.4, в Postgres есть полезные встроенные функции, которые делают функцию из первого ответа проще и, возможно, быстрее (это то, что EXPLAIN говорит мне, так или иначе: "(cost = 0.00 ..0,07 строк = 1 ширина = 64) "для этого запроса против" (стоимость = 0,00..60,02 строк = 1 ширина = 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']));