Ich habe eine Tabelle und möchte eine Zeile pro ID mit verketteten Feldwerten ziehen.
In meiner Tabelle habe ich zum Beispiel Folgendes:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
Und ich möchte ausgeben:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
In MySQL konnte ich die Aggregatfunktion verwenden GROUP_CONCAT
, aber das scheint hier nicht zu funktionieren ... Gibt es ein Äquivalent für PostgreSQL oder eine andere Möglichkeit, dies zu erreichen?
sql
postgresql
group-concat
string-aggregation
TwixxyKit
quelle
quelle
Antworten:
Dies ist wahrscheinlich ein guter Ausgangspunkt (nur Version 8.4+):
array_agg gibt ein Array zurück, aber Sie können es in CAST umwandeln, um es nach Bedarf zu textieren und zu bearbeiten (siehe Erläuterungen unten).
Vor Version 8.4 müssen Sie diese vor der Verwendung selbst definieren:
(umschrieben aus der PostgreSQL-Dokumentation)
Erläuterungen:
quelle
Seit 9.0 ist das noch einfacher:
quelle
array_agg
)string_agg(some_column, ',' ORDER BY some_column)
string_agg(surname || ', ' || forename, '; ' ORDER BY surname, forename)
distinct
mit string_agg funktioniert, also kann man es verwendenstring_agg(distinct some_solumn, ',')
TEXT
umwandeln müssen , wenn es sich um einen nicht stringbaren Wert handelt (z. B.uuid
). Dies würde aussehen wiestring_agg(some_column::text, ',')
Wird auch tun.
quelle
Versuchen Sie es so:
quelle
und die Version, die für den Array-Typ verwendet werden soll :
quelle
character varying(5)[]
. Außerdem habe ich überprüft, dass für meinen Zweck - unnest benötigt wird, sonst werden Sie sehenERROR: cannot accumulate arrays of different dimensionality
.Mein Vorschlag in postgresql
quelle
ORDER BY
in einer inneren Abfrage? Geht die Bestellung nicht trotzdem verloren?Hoffe, dass die unten stehende Oracle-Abfrage funktioniert.
quelle