it-swarm.com.de

Wie kann ich ein eindeutiges Array in PostgreSQL erhalten?

Folgende

SELECT ARRAY[a,b,c,d]
FROM ( VALUES
  ('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);

Kehrt zurück {foo,bar,foo,baz} vom Typ text[]. Ich hätte gern {foo,bar,baz} vom Typ text[]mit einem der doppelten bar Elemente entfernt? Hat PostgreSQL eine eindeutige Funktion, die auf einem Textarray oder einem anyarray von anyelement funktioniert?

2
Evan Carroll

Es gibt zwar keine Funktion, um dies zu erreichen, aber Sie können verwenden

  1. unnest() um ein Array von Elementen in eine Tabelle mit einspaltigen Zeilen zu konvertieren,
  2. DISTINCT zum Entfernen von Duplikaten
  3. ARRAY(query), um die Zeile neu zu erstellen.

Diese Redewendung sieht aus wie:

ARRAY( SELECT DISTINCT ... FROM unnest(arr) )

Und in der Praxis wird so angewendet,

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);

Wenn Sie möchten, dass es sortiert wird, können Sie Folgendes tun:

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);

Und das alles kann mit CROSS JOIN LATERAL Geschrieben werden, was viel sauberer ist,

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
);

  • Antwort inspiriert von RhodiumToad auf irc.freenode.net/#postgresql
5
Evan Carroll