Ich suche nach einer Möglichkeit, die Zeichenfolgen eines Feldes innerhalb einer Gruppe durch Abfrage zu verketten. So habe ich zum Beispiel eine Tabelle:
ID COMPANY_ID EMPLOYEE
1 1 Anna
2 1 Bill
3 2 Carol
4 2 Dave
und ich wollte mich nach company_id gruppieren, um so etwas wie:
COMPANY_ID EMPLOYEE
1 Anna, Bill
2 Carol, Dave
In mySQL gibt es eine integrierte Funktion, um diese group_concat auszuführen
Antworten:
PostgreSQL 9.0 oder höher:
Neuere Versionen von Postgres (seit Ende 2010) verfügen über die
string_agg(expression, delimiter)
Funktion, die genau das tut, wonach die Frage gestellt wurde, und Sie können sogar die Trennzeichenfolge angeben:Postgres 9.0 hat außerdem die Möglichkeit hinzugefügt, eine
ORDER BY
Klausel in einem beliebigen aggregierten Ausdruck anzugeben . Andernfalls ist die Reihenfolge undefiniert. So können Sie jetzt schreiben:Oder in der Tat:
PostgreSQL 8.4 oder höher:
PostgreSQL 8.4 (2009) führte die Aggregatfunktion ein,
array_agg(expression)
die die Werte zu einem Array verkettet. Dannarray_to_string()
kann das gewünschte Ergebnis erzielt werden:string_agg
für Versionen vor 8.4:Falls jemand auf der Suche nach einem kompatiblen Shim für Datenbanken vor 9.0 darauf stößt, ist es möglich, alles
string_agg
außer derORDER BY
Klausel zu implementieren .Mit der folgenden Definition sollte dies also genauso funktionieren wie in einer 9.x Postgres-Datenbank:
Dies ist jedoch ein Syntaxfehler:
Getestet auf PostgreSQL 8.3.
Benutzerdefinierte Variationen (alle Postgres-Versionen)
Vor 9.0 gab es keine integrierte Aggregatfunktion zum Verketten von Zeichenfolgen. Die einfachste benutzerdefinierte Implementierung (unter anderem von Vajda Gabo in diesem Mailinglistenbeitrag vorgeschlagen ) ist die Verwendung der integrierten
textcat
Funktion (die hinter dem||
Operator liegt):Hier ist die
CREATE AGGREGATE
Dokumentation.Dadurch werden einfach alle Saiten ohne Trennzeichen zusammengeklebt. Um ein "," zwischen ihnen einzufügen, ohne es am Ende zu haben, möchten Sie möglicherweise Ihre eigene Verkettungsfunktion erstellen und die oben stehende "Textkatze" ersetzen. Hier ist eine, die ich am 8.3.12 zusammengestellt und getestet habe:
Diese Version gibt ein Komma aus, auch wenn der Wert in der Zeile null oder leer ist. Sie erhalten also die folgende Ausgabe:
Wenn Sie zusätzliche Kommas entfernen möchten, um dies auszugeben:
Fügen
ELSIF
Sie dann der Funktion einen Häkchen wie folgt hinzu:quelle
array_to_string(array_agg(employee), ',')
?Order By
Klausel innerhalb der Aggregatfunktion zulassen , z. B.string_agg(employee, ',' Order By employee)
Wie wäre es mit den in Postgres integrierten Array-Funktionen? Zumindest unter 8.4 funktioniert dies sofort:
quelle
Ab PostgreSQL 9.0 können Sie die Aggregatfunktion string_agg verwenden . Ihr neues SQL sollte ungefähr so aussehen:
quelle
Ich beanspruche keine Gutschrift für die Antwort, weil ich sie nach einiger Suche gefunden habe:
Was ich nicht wusste ist, dass Sie mit PostgreSQL Ihre eigenen Aggregatfunktionen mit CREATE AGGREGATE definieren können
Dieser Beitrag in der PostgreSQL-Liste zeigt, wie trivial es ist, eine Funktion zu erstellen, um das zu tun, was erforderlich ist:
quelle
Wie bereits erwähnt, ist das Erstellen einer eigenen Aggregatfunktion das Richtige. Hier ist meine Verkettungsaggregatfunktion ( Details finden Sie auf Französisch ):
);
Und dann benutze es als:
quelle
Dieses neueste Ankündigungslisten-Snippet könnte von Interesse sein, wenn Sie ein Upgrade auf 8.4 durchführen:
Ich würde auf die 8.4-Entwicklungsdokumente verlinken, aber sie scheinen diese Funktion noch nicht aufzulisten.
quelle
Weiterverfolgung von Kevs Antwort anhand der Postgres-Dokumente:
Erstellen Sie zuerst ein Array der Elemente und verwenden Sie dann die integrierte
array_to_string
Funktion.quelle
Im Folgenden wird noch einmal auf die Verwendung einer benutzerdefinierten Aggregatfunktion für die Verkettung von Zeichenfolgen eingegangen: Sie müssen sich daran erinnern, dass die select-Anweisung Zeilen in beliebiger Reihenfolge platziert. Daher müssen Sie in der from- Anweisung eine Unterauswahl mit einer order by- Klausel und treffen dann eine äußere Auswahl mit einer group by- Klausel, um die Zeichenfolgen zu aggregieren, also:
quelle
Ich fand diese PostgreSQL-Dokumentation hilfreich: http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html .
In meinem Fall habe ich nach einfachem SQL gesucht, um ein Feld mit Klammern zu verketten, wenn das Feld nicht leer ist.
quelle
Verwenden Sie die
STRING_AGG
Funktion für PostgreSQL und Google BigQuery SQL :quelle
Ab Version PostgreSQL 9.0 können Sie die Aggregatfunktion string_agg verwenden. Ihr neues SQL sollte ungefähr so aussehen:
quelle
Sie können auch die Formatierungsfunktion verwenden. Dies kann sich auch implizit um die Typkonvertierung von Text, int usw. selbst kümmern.
quelle
Ich verwende Jetbrains Rider und es war mühsam, die Ergebnisse aus den obigen Beispielen zu kopieren, um sie erneut auszuführen, da alles in JSON zu verpacken schien. Dies verbindet sie zu einer einzigen Anweisung, die einfacher auszuführen war
quelle
Wenn Sie sich in Amazon Redshift befinden und string_agg nicht unterstützt wird, verwenden Sie listagg.
quelle