So sortieren Sie das Ergebnis aus string_agg ()

96

Ich habe einen Tisch:

CREATE TABLE tblproducts
(
productid integer,
product character varying(20)
)

Mit den Zeilen:

INSERT INTO tblproducts(productid, product) VALUES (1, 'CANDID POWDER 50 GM');
INSERT INTO tblproducts(productid, product) VALUES (2, 'SINAREST P SYP 100 ML');
INSERT INTO tblproducts(productid, product) VALUES (3, 'ESOZ D 20 MG CAP');
INSERT INTO tblproducts(productid, product) VALUES (4, 'HHDERM CREAM 10 GM');
INSERT INTO tblproducts(productid, product) VALUES (5, 'CREAM 15 GM');
INSERT INTO tblproducts(productid, product) VALUES (6, 'KZ LOTION 50 ML');
INSERT INTO tblproducts(productid, product) VALUES (7, 'BUDECORT 200 Rotocap');

Wenn ich string_agg()am ausführe tblproducts:

SELECT string_agg(product, ' | ') FROM "tblproducts"

Es wird das folgende Ergebnis zurückgegeben:

CANDID POWDER 50 GM | ESOZ D 20 MG CAP | HHDERM CREAM 10 GM | CREAM 15 GM | KZ LOTION 50 ML | BUDECORT 200 Rotocap

Wie kann ich die aggregierte Zeichenfolge in der Reihenfolge sortieren, in der ich sie verwenden würde ORDER BY product?

Ich verwende PostgreSQL 9.2.4.

Vivek S.
quelle

Antworten:

219

Mit postgres 9.0+ können Sie schreiben:

select string_agg(product,' | ' order by product) from "tblproducts"

Details hier .

Igor Romanchenko
quelle
Können Sie bitte eine Lösung vorschlagen, die auch bei Verwendung von Fensterfunktionen funktioniert?
Saurabh Gujarani
Danke für den Link. Die Suche string_aggin der Dokumentation führt Sie nicht dorthin.
Manngo
23

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

SELECT
  STRING_AGG(prod, '|') WITHIN GROUP (ORDER BY product)
FROM ... 
Luuk
quelle
3
Die Frage betraf PostgreSQL. Die WITHIN GROUPKlausel gilt nicht für die string_aggFunktion, wie dies bei Microsoft SQL der Fall ist.
Manngo
4
Die Frage betraf string_agg. Postgres war neben seiner Frage und er erwähnte sie zuletzt. Die Frage ist auch für andere nützlich.
Nomen
1
Wenn diese Syntax zu Syntaxfehlern führt, überprüfen Sie Ihre Kompatibilitätsstufe: stackoverflow.com/questions/43611024/…
Mr. TA
4
select string_agg(prod,' | ') FROM 
  (SELECT product as prod FROM tblproducts ORDER BY product )MAIN;

SQL FIDDLE

Ilesh Patel
quelle
2
Ich hatte das gleiche Problem wie OP und dieser Ansatz war mein erster Gedanke, aber leider funktioniert er nicht (was mich hierher gebracht hat), während Igor es tut.
Chbrown
Auf meiner Seite haben beide Ansätze (Ileshs und Igor's) funktioniert.
Stephan
2
Falsche Antwort. Es könnte funktionieren, aber es ist nicht garantiert, dass es funktioniert.
Zyamys
Die relationale Datenbank basiert teilweise auf mathematischen Mengen, und dies spiegelt sich in der Tatsache wider, dass ein Grundprinzip in SQL darin besteht, dass die Zeilenreihenfolge nicht signifikant ist. Selbst wenn Sie eine ORDER BYKlausel in die Unterabfrage aufnehmen, werden FROMdie Daten in der Klausel nicht unbedingt in der richtigen Reihenfolge angezeigt. Wenn das funktioniert, ist es reines Glück.
Manngo
1

Ich suchte nach der gleichen Lösung für SQL Server und fand die folgende Lösung

SELECT string_agg(product, ' | ') WITHIN GROUP (ORDER BY product) FROM tblproducts
mveera
quelle