PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres - Função para retornar a interseção de 2 ARRAYs?


Desde 8.4, existem builtins úteis no Postgres que tornam a função da primeira resposta mais fácil e possivelmente mais rápida (é o que EXPLAIN me diz, de qualquer maneira:"(cost=0.00..0.07 rows=1 width=64)" para esta consulta vs. . "(custo=0.00..60.02 linhas=1 largura=64)" para o original).

O código simplificado é:
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 sim, você pode transformá-lo em uma função:
CREATE FUNCTION array_intersect(anyarray, anyarray)
  RETURNS anyarray
  language sql
as $FUNCTION$
    SELECT ARRAY(
        SELECT UNNEST($1)
        INTERSECT
        SELECT UNNEST($2)
    );
$FUNCTION$;

que você pode chamar como
SELECT array_intersect(array['two', 'four', 'six']
                     , array['four', 'six', 'eight']);

Mas você também pode chamá-lo de inline também:
 SELECT array(select unnest(array['two', 'four', 'six']) intersect
              select unnest(array['four', 'six', 'eight']));