sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres:¿función para devolver la intersección de 2 ARRAY?

Desde la versión 8.4, hay componentes útiles en Postgres que hacen que la función desde la primera respuesta sea más fácil y posiblemente más rápida (eso es lo que EXPLAIN me dice, de todos modos:"(costo =0.00 ... 0.07 filas =1 ancho =64)" para esta consulta vs . "(costo=0.00..60.02 filas=1 ancho=64)" para el original).

El código simplificado es:

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

y sí, puedes convertirlo en una función:

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

que puedes llamar como

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

Pero también puedes llamarlo en línea:

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