... Onde estão as bibliotecas padrão (?) Para este tipo de utilitário array_X ??
Tente pesquisar ... Veja alguns, mas nenhum padrão:
array_distinct()
Função snippet-lib mais simples e rápida
Aqui, a implementação mais simples e talvez mais rápida para array_unique()
ou array_distinct()
:
CREATE FUNCTION array_distinct(anyarray) RETURNS anyarray AS $f$
SELECT array_agg(DISTINCT x) FROM unnest($1) t(x);
$f$ LANGUAGE SQL IMMUTABLE;
NOTA: funciona como esperado com qualquer tipo de dados, exceto com matriz de matrizes,
SELECT array_distinct( array[3,3,8,2,6,6,2,3,4,1,1,6,2,2,3,99] ),
array_distinct( array['3','3','hello','hello','bye'] ),
array_distinct( array[array[3,3],array[3,3],array[3,3],array[5,6]] );
o "efeito colateral" é explodir todas as matrizes em um conjunto de elementos.
PS: com arrays JSONB funciona bem,
SELECT array_distinct( array['[3,3]'::JSONB, '[3,3]'::JSONB, '[5,6]'::JSONB] );
Editar: mais complexo, mas útil, um parâmetro "drop nulls"
CREATE FUNCTION array_distinct(
anyarray,
boolean DEFAULT false
) RETURNS anyarray AS $f$
SELECT array_agg(DISTINCT x)
FROM unnest($1) t(x)
WHERE CASE WHEN $2 THEN x IS NOT NULL ELSE true END;
$f$ LANGUAGE SQL IMMUTABLE;