so schließen Sie null-Werte in array_agg wie in string_agg mit postgres?
Wenn ich array_agg
zu sammeln, die Namen, die ich meinen Namen durch Kommas getrennt, aber in Fall gibt es eine null
Wert, , null " wird auch als name in der Gesamtheit. Zum Beispiel :
SELECT g.id,
array_agg(CASE WHEN g.canonical = 'Y' THEN g.users ELSE NULL END) canonical_users,
array_agg(CASE WHEN g.canonical = 'N' THEN g.users ELSE NULL END) non_canonical_users
FROM groups g
GROUP BY g.id;
gibt es ,Larry,Phil
statt nur Larry,Phil
(in meinem 9.1.2, es zeigt NULL,Larry,Phil
). wie in diese fiddle
Statt, wenn ich string_agg()
zeigt er mir nur die Namen (ohne leer Kommas oder Nullen) wie hier
Das problem ist, dass ich Postgres 8.4
auf dem server installiert, und string_agg()
funktioniert dort nicht. Gibt es eine Möglichkeit, um array_agg funktionieren ähnlich wie string_agg() ?
InformationsquelleAutor der Frage Daud | 2012-10-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
SQL Fiddle
Oder, einfacher und billiger sein kann, mit
array_to_string
beseitigt nulls:SQL Fiddle
InformationsquelleAutor der Antwort Clodoaldo Neto
Mit postgresql-9.3 kann man dies tun;
Update: postgresql-9.4;
InformationsquelleAutor der Antwort Dale O'Brien
In der Lösung der Allgemeinen Frage der entfernen der null-Werte aus array Aggregate gibt es zwei Möglichkeiten, den Angriff auf das problem: entweder tun array_agg(unnest(array_agg(x)) oder erstellen ein benutzerdefiniertes Aggregat.
Die erste ist die form gezeigt oben:
Zweiten:
Aufrufen der zweite ist (natürlich) ein wenig schöner aus als die erste:
InformationsquelleAutor der Antwort rorycl
Ich bin das hinzufügen dieser, obwohl dieser thread ist schon ziemlich alt, aber ich lief in dieser netten trick, der funktioniert ganz gut auf kleinen arrays. Es läuft auf Postgres 8.4+ ohne zusätzliche Bibliotheken oder Funktionen.
Den
array_to_string()
Methode tatsächlich entledigt sich der null-Werte.InformationsquelleAutor der Antwort ced-b
Als vorgeschlagen wurde, in den Kommentaren können Sie schreiben, eine Funktion zum ersetzen von null-Werten in ein array, aber wie auch schon in dem verlinkten thread in die Kommentare, diese Art von Niederlagen die Effizienz der aggregate-Funktion, wenn Sie ein Aggregat anlegen, teilen Sie es anschließend in aggregierter Form wieder.
Ich denke, halten, null-Werte im array ist nur eine (vielleicht unerwünschte) Funktion Array_Agg. Sie könnte verwenden von Unterabfragen, dies zu vermeiden:
SQL FIDDLE
InformationsquelleAutor der Antwort GarethD
Eine größere Frage ist, warum ziehen Sie alle Benutzer - /Gruppen-combos auf einmal. Ihr garantiert UI cant handle all dieser Daten. Hinzufügen von paging-oversized-Daten ist auch eine schlechte Idee. Holen Sie sich Ihre Benutzer-filter-set, bevor Sie die Daten sehen. Stellen Sie sicher, dass die JOIN-option gesetzt ist in der Liste, so dass Sie können filter für die Leistung, wenn Sie möchten. Manchmal 2 Abfragen Benutzer leichter machen, wenn Sie beide schnell.
InformationsquelleAutor der Antwort Michael