Unnest-array durch eine Ebene
Möchte ich ein array von n
Abmessungen und Rückgabe eingestellt mit den Zeilen des arrays von n-1
Dimensionen. Zum Beispiel, nehmen Sie die array ARRAY[[1,2,3], [4,5,6], [7,8,9]]
und zurückgeben eines Satzes {1,2,3}, {4,5,6}, {7,8,9}
. Mit unnest gibt den Satz 1,2,3,4,5,6,7,8,9
.
Ich habe versucht, greifen die unnest-Funktion von PostgreSQL-8.4, die scheint, wie Sie tun würde, was ich Suche:
CREATE OR REPLACE FUNCTION tstng.unnest2(anyarray)
RETURNS SETOF anyelement
LANGUAGE plpgsql
IMMUTABLE
AS $$
BEGIN
RETURN QUERY SELECT $1[i]
FROM generate_series(array_lower($1,1), array_upper($1,1)) i;
END;
$$;
Jedoch SELECT tstng.unnest2(ARRAY[[1,2,3], [4,5,6], [7,8,9]]);
gibt den Satz , ,
(d.h.: 3 null Zeilen).
Habe ich auch herausgefunden, dass SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0];
null zurück, und ich glaube, dass die Wurzel meines Problems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erklären
wieder die gleichen wie
NULL. Ich zitiere die docs über diese Angelegenheit:
0
hat keine spezielle Bedeutung hier.Auch mit einem zwei-dimensionale arrays, die Sie benötigen, zwei Indizes um ein Basis-element. Wie diese:
Ergebnis:
Den ersten Teil deiner Nachricht ist ein wenig unklar.
Ergebnis:
Dass zwei Dimensionen mit 3 Elementen (1 bis 3) jedes (9 Basis-Elemente).
Wenn Sie möchten
n-1
Dimensionen, dann ist dies ein korrektes Ergebnis:Ergebnis:
Dass eine dimension.
unnest()
erzeugt immer eine base element pro Zeile. Ich bin mir nicht sicher, was für ein Ergebnis Sie sich wünschen genau . Dein Beispiel ist nur ein weiteres 2-dimenstional array mit einem fehlenden Satz von geschweiften Klammern ... ?Wenn Sie möchten, eine Scheibe array, versuchen Sie diese Schreibweise:
Ergebnis:
Oder so:
Ergebnis:
Zu glätten das Ergebnis (Holen Sie sich ein 1D-array):
Lesen Sie mehr in der Anleitung hier.
Funktion
Späterer test ergab, dass diese plpgsql-Funktion ist viel schneller. Erfordert Postgres 9.1 oder höher:
Finden Sie unter:
Dies ist eine verbesserte und vereinfachte version des die Funktion von Lukas geschrieben:
Für Postgres-Versionen < 8.4,
array_agg()
ist nicht standardmäßig installiert. Erstellen Sie zuerst:Auch,
generate_subscripts()
ist nicht geboren, noch nicht. Verwenden Sie stattdessen:Nennen:
Ergebnis
SQL Fiddle.
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
bekomme ich2
nicht1
. Und2
ist genau das, was ich erwartet hatte. Warum1
? Ist es ein Fehler? Oder bin ich etwas fehlt? Gleiche mitSELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][3];
nachgeben{{4,5,6}}
, nicht{{4,5}}
(Und durch die Weg, den docs empfehlen die Verwendung des full[2:2][1:3]
notation, um Sie ausdrücklich zu, und ich Stimme zu!)Scheiben von einer multi-dimensionalen zurückgegeben werden, als multi-dimensionale arrays. Dies ist eine modifizierte version von unnest, der eine 2-dimensionale array und zurückgeben eines Satzes von 1-dimensionalen arrays.
update: modifiziert zur Nutzung der built-in array_agg Aggregatfunktion, wurde standardmäßig als 8.4. (http://www.postgresql.org/docs/9.2/static/functions-aggregate.html)
Vorsichtsmaßnahmen:
code:
Ergebnis:
Nun, sagen wir mal aus irgendeinem Grund Sie wollen einen einfachen Zugang zu nur einem dieser arrays zurückgegeben wird. Die folgende Funktion fügt eine optionale index-parameter auf, wird wieder das verschachtelte array der index, den Sie bieten, oder, wenn Sie null ist, wird die Ausgabe der vollständigen Reihe von "unnested" arrays.
Ergebnisse:
array_agg()
Funktion das ist der standard-name fürarray_accum
.Ein Wort der Vorsicht: bei der Verwendung von array_agg auf postgres <9 Reihenfolge ändern kann
PostgreSQL array_agg bestellen
Wenn Sie planen, verwenden Sie die unnested-array sagen für die Suche nach argmax, dadurch werden Ihre Daten beschädigt.