Le suivant
SELECT ARRAY[a,b,c,d]
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Retour {foo,bar,foo,baz}
de type text[]
. Je voudrais obtenir {foo,bar,baz}
de type text[]
avec l'un des éléments bar
en double supprimé? PostgreSQL a-t-il une fonction unique qui fonctionne sur un tableau de texte, ou un anyarray
de anyelement
?
Bien qu'il n'y ait aucune fonction pour y parvenir, vous pouvez utiliser
unnest()
pour convertir un tableau d'éléments, en un tableau de lignes d'une colonne,DISTINCT
pour supprimer les doublonsARRAY(query)
pour recréer la ligne.Cet idiome ressemble,
ARRAY( SELECT DISTINCT ... FROM unnest(arr) )
Et en pratique est appliqué comme ça,
SELECT ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[a,b,c,d]) AS a(e))
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Si vous voulez le trier, vous pouvez le faire,
SELECT ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[a,b,c,d]) AS a(e) ORDER BY e)
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Et cela peut tout être écrit avec CROSS JOIN LATERAL
qui est beaucoup plus propre,
SELECT ARRAY(
SELECT DISTINCT e
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d)
CROSS JOIN LATERAL unnest(ARRAY[a,b,c,d]) AS a(e)
-- ORDER BY e; -- if you want it sorted
);