Unnest Array um eine Ebene

8

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.

    
Matt 15.11.2011, 13:32
quelle

3 Antworten

11

Erkläre

%Vor%

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:

%Vor%

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:

%Vor%

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 ...?

%Vor%

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 .

Funktion

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:

%Vor%

Auch generate_subscripts() ist noch nicht geboren. Verwenden Sie stattdessen:

%Vor%

Anruf:

%Vor%

Ergebnis

%Vor%

SQL Fiddle.

    
Erwin Brandstetter 15.11.2011, 20:53
quelle
6

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:

  • Es funktioniert nur für zweidimensionale Arrays (ich sollte die Funktion wahrscheinlich umbenennen, um diese Einschränkung widerzuspiegeln).
  • Wenn Sie auf 8.3 sind (und kein Upgrade durchführen können), müssen Sie das array_accum-Aggregat definieren und alle Referenzen in den folgenden Funktionen von array_agg auf array_accum ändern. Ссылка

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%     
Lukas Eklund 15.03.2012 17:25
quelle
0

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.

    
AlonG 02.07.2013 12:46
quelle

Tags und Links