web-dev-qa-db-fra.com

Comment puis-je obtenir un tableau unique dans PostgreSQL?

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?

2
Evan Carroll

Bien qu'il n'y ait aucune fonction pour y parvenir, vous pouvez utiliser

  1. unnest() pour convertir un tableau d'éléments, en un tableau de lignes d'une colonne,
  2. DISTINCT pour supprimer les doublons
  3. ARRAY(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
);

  • Réponse inspirée de RhodiumToad sur irc.freenode.net/#postgresql
5
Evan Carroll