Ich möchte ein Array von n
Dimensionen nehmen und eine Menge von Arrays mit n-1
Dimensionen zurückgeben. Nehmen Sie zum Beispiel das Array ARRAY[[1,2,3], [4,5,6], [7,8,9]]
und geben Sie eine Menge {1,2,3}, {4,5,6}, {7,8,9}
zurück. Die Verwendung von unnest gibt die Menge 1,2,3,4,5,6,7,8,9
zurück.
Ich habe versucht, die Funktion von PostgreSQL 8.4 zu verwenden, die so aussieht, als würde sie tun, wonach ich suche:
%Vor% Jedoch gibt SELECT tstng.unnest2(ARRAY[[1,2,3], [4,5,6], [7,8,9]]);
die Menge , ,
(d. h. 3 Nullzeilen) zurück.
Ich habe auch festgestellt, dass SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0];
null liefert, was meiner Meinung nach die Wurzel meines Problems ist.
gibt dasselbe wie
zurück %Vor%was NULL ist. Ich zitiere die Dokumente zu diesem Thema :
Standardmäßig ist der Untergrenze-Indexwert der Dimensionen eines Arrays auf eins gesetzt.
0
hat hier keine besondere Bedeutung.
Bei einem zweidimensionalen Array benötigen Sie außerdem zwei Indizes , um ein Basiselement zu erhalten. So:
Ergebnis:
%Vor%Der erste Teil Ihrer Nachricht ist etwas unklar.
%Vor%Ergebnis:
%Vor% Das sind zwei Dimensionen mit jeweils 3 Elementen (1 bis 3) (9 Basiselemente).
Wenn Sie n-1
Dimensionen möchten, ist dies ein korrektes Ergebnis:
Ergebnis:
%Vor% Das ist eine Dimension. unnest()
erzeugt immer ein Basiselement pro Zeile. Ich bin mir nicht sicher, welches Ergebnis Sie genau wünschen. Ihr Beispiel ist nur ein weiteres 2-dimensionales Array mit einem fehlenden Satz geschweifter Klammern ...?
Wenn Sie ein Segment des Arrays möchten, versuchen Sie diese Schreibweise:
%Vor%Ergebnis:
%Vor%Oder das:
%Vor%Ergebnis:
%Vor%Um das Ergebnis zu reduzieren (ein 1D-Array zu erhalten):
Lesen Sie mehr im Handbuch .
Späterer Test ergab, dass diese plpgsql-Funktion viel schneller ist. Benötigt Postgres 9.1 oder höher:
%Vor%Siehe:
Dies ist eine verbesserte und vereinfachte Version der Funktion, die Lukas gepostet hat :
%Vor% Für Postgres-Versionen & lt; 8.4, array_agg()
ist standardmäßig nicht installiert. Erstelle es zuerst:
Auch generate_subscripts()
ist noch nicht geboren. Verwenden Sie stattdessen:
Anruf:
%Vor%Ergebnis
%Vor%Slices eines mehrdimensionalen Objekts werden als mehrdimensionale Arrays zurückgegeben. Dies ist eine modifizierte Version von unnest, die ein 2-dimensionales Array annimmt und einen Satz von 1-dimensionalen Arrays zurückgibt.
update : geändert, um die integrierte array_agg-Aggregatfunktion zu verwenden, die standardmäßig ab 8.4 verwendet wurde. ( Ссылка )
Vorbehalte:
code:
%Vor%Ergebnis:
%Vor%Nehmen wir nun an, Sie möchten einfach nur auf eines dieser Arrays zugreifen, das zurückgegeben wird. Die folgende Funktion fügt einen optionalen Indexparameter hinzu, der das geschachtelte Array des von Ihnen angegebenen Indexes zurückgibt, oder, wenn Sie null angeben, den vollständigen Satz von "nicht verlinkten" Arrays ausgibt.
%Vor%Ergebnisse:
%Vor%Ein Wort der Warnung: Wenn Sie array_agg auf postgres & lt; 9 verwenden, kann sich die Reihenfolge ändern PostgreSQL array_agg-Bestellung Wenn Sie das nicht-nested Array zum Finden von argmax verwenden möchten, wird dies Ihre Daten beschädigen.
Tags und Links arrays postgresql plpgsql