PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres - Fonction pour renvoyer l'intersection de 2 ARRAYs ?

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']));