A seguir
SELECT ARRAY[a,b,c,d]
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Retornos {foo,bar,foo,baz}
do tipo text[]
. Gostaria de obter {foo,bar,baz}
do tipo text[]
com um dos elementos duplicados foo
removidos ? O PostgreSQL tem uma função exclusiva que funciona em um array de texto ou anyarray
em um anyelement
?
Embora não haja nenhuma função para fazer isso, você pode usar
unnest()
para converter uma matriz de elementos, em uma tabela de linhas de uma coluna,DISTINCT
para remover duplicatasARRAY(query)
para recriar a linha.Essa expressão parece,
E na prática é aplicado assim,
Se você quiser que seja classificado, você pode fazer,
E isso tudo pode ser escrito com o
CROSS JOIN LATERAL
que é muito mais limpo,Uma função simples baseada na resposta de @Evan Carroll
com isso no lugar, você pode
Talvez mais uma pergunta/comentário.
Este código abaixo preserva a ordenação original. Como pode ser melhorado / tornado mais eficiente.
Em essência, acredito que também cumprirá a tarefa definida.
Eu tenho que agradecer pelo ponteiro "lateral join" - que torna super fácil de executar isso sem ter que envolvê-lo como uma função :-)
Se os valores de entrada estiverem em uma coluna (essencialmente um array em termos relacionais), o array exclusivo também pode ser obtido usando a
array_agg()
função stock com umaDISTINCT
palavra-chave:Resultado:
Se a entrada for uma matriz, an
unnest()
pode ser usado para transformar a entrada em uma tabela de uma coluna primeiro e depoisarray_agg(DISTINCT ...)
.