PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres - Funzione per restituire l'intersezione di 2 ARRAY?

Dalla versione 8.4, ci sono utili builtin in Postgres che rendono la funzione dalla prima risposta più semplice e possibilmente più veloce (questo è quello che mi dice EXPLAIN, comunque:"(cost=0.00..0.07 righe=1 larghezza=64)" per questa query vs . "(costo=0.00..60.02 righe=1 larghezza=64)" per quello originale).

Il codice semplificato è:

SELECT ARRAY
    (
        SELECT UNNEST(a1)
        INTERSECT
        SELECT UNNEST(a2)
    )
FROM  (
        SELECT  array['two', 'four', 'six'] AS a1
              , array['four', 'six', 'eight'] AS a2
      ) q;

e sì, puoi trasformarlo in una funzione:

CREATE FUNCTION array_intersect(anyarray, anyarray)
  RETURNS anyarray
  language sql
as $FUNCTION$
    SELECT ARRAY(
        SELECT UNNEST($1)
        INTERSECT
        SELECT UNNEST($2)
    );
$FUNCTION$;

che puoi chiamare come

SELECT array_intersect(array['two', 'four', 'six']
                     , array['four', 'six', 'eight']);

Ma puoi anche chiamarlo inline:

 SELECT array(select unnest(array['two', 'four', 'six']) intersect
              select unnest(array['four', 'six', 'eight']));