Depuis 8.4, il existe des fonctions intégrées utiles dans Postgres qui rendent la fonction de la première réponse plus facile et peut-être plus rapide (c'est ce que EXPLAIN me dit, de toute façon :"(cost=0.00..0.07 rows=1 width=64)" pour cette requête vs . "(cost=0.00..60.02 rows=1 width=64)" pour celui d'origine).
Le code simplifié est :
SELECT ARRAY
(
SELECT UNNEST(a1)
INTERSECT
SELECT UNNEST(a2)
)
FROM (
SELECT array['two', 'four', 'six'] AS a1
, array['four', 'six', 'eight'] AS a2
) q;
et oui, vous pouvez le transformer en fonction :
CREATE FUNCTION array_intersect(anyarray, anyarray)
RETURNS anyarray
language sql
as $FUNCTION$
SELECT ARRAY(
SELECT UNNEST($1)
INTERSECT
SELECT UNNEST($2)
);
$FUNCTION$;
que vous pouvez appeler comme
SELECT array_intersect(array['two', 'four', 'six']
, array['four', 'six', 'eight']);
Mais vous pouvez tout aussi bien l'appeler en ligne :
SELECT array(select unnest(array['two', 'four', 'six']) intersect
select unnest(array['four', 'six', 'eight']));