Estava realizando algumas queries aqui no meu trabalho e tive a necessidade de uma função que retornasse um array contendo os elementos de um determinado array e não estão presentes em outro, igual ao array_diff do PHP [1].
Para resolver esse pequeno problema bastou um SELECT, vejam a implementação da função “array_diff” para PostgreSQL abaixo:
CREATE OR REPLACE FUNCTION array_diff (anyarray, anyarray) RETURNS anyarray
AS $$
SELECT array(
SELECT $1[s.i]
FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
WHERE NOT $1[s.i] = ANY($2)
);
$$
LANGUAGE sql;
postgres@bdteste=# SELECT array_diff(array[1, 2, 3], array[1, 4, 3]);
array_diff
————
{2}
(1 row)
postgres@bdteste=# SELECT array_diff(array[1, 4, 3], array[1, 2, 3]);
array_diff
————
{4}
(1 row)
Espero ter ajudado de alguma forma.
Cordialmente,
Fabrízio de Royes Mello
fabriziomello [at] gmail.com
A utilização da função "unnest" limita vc a utilizar a função somente em versões iguais ou superiores a 8.4.
De qualquer forma ficou muito enxuta a versão que vc implemento… gostei bastante.
Fabrízio de Royes Mello
fabriziomello [at] gmail.com
Grande abraço e obrigado pela luz ;)
CREATE OR REPLACE FUNCTION arrayDiff(anyarray, anyarray) RETURNS anyarray
AS $$
SELECT array(
SELECT x
FROM unnest($1) AS x WHERE x not in (SELECT unnest($2))
);
$$
LANGUAGE sql;