Forklar
VÆLG (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
returnerer det samme som
VÆLG (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
som er NULL. Jeg citerer dokumenterne om den sag:
Som standard er den nedre indeksværdi for et arrays dimensioner sat til én.
0
har ingen speciel betydning her. Med et todimensionelt array har du også brug for to indekser for at få et basiselement. Sådan:
VÆLG (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Resultat:
2
Den første del af din besked er lidt uklar.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Resultat:
[1:3][1:3]
Det er to dimensioner med 3 elementer (1 til 3) hver (9 basiselementer).
Hvis du vil have n-1
dimensioner, så er dette et korrekt resultat:
VÆLG ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Resultat:
{1,2,3,4,5,6,7,8,9}
Det er én dimension. unnest()
producerer altid et basiselement pr. række. Jeg er ikke sikker på, hvilket resultat du ønsker præcist. Dit eksempel er bare endnu et 2-dimensionelt array med et manglende sæt krøllede parenteser ... ?
{1,2,3}, {4,5,6}, {7,8,9}
Hvis du vil have et udsnit af arrayet , prøv denne notation:
VÆLG (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Resultat:
{{1,2,3},{4,5,6}}
Eller denne:
VÆLG (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Resultat:
{{4,5}}
At udjævne resultatet (få et 1D-array):
- Sådan vælger du 1d array fra 2d array postgresql
Læs mere i manualen her.
Funktion
Senere test viste, at denne plpgsql-funktion er meget hurtigere. Kræver Postgres 9.1 eller nyere:
OPRET ELLER ERSTAT FUNKTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY) RETURERER SÆT AF ANYARRAY AS$func$BEGIN FOREACH a SLICE 1 I ARRAY $1 LOOP RETURN NEXT; END LOOP;END$func$ LANGUAGE plpgsql IMMUTABLE;
Se:
- Hvordan løsnes et 2d-array til et 1d-array hurtigt i PostgreSQL?
Dette er en forbedret og forenklet version af funktionen Lukas postede:
OPRET ELLER ERSTAT FUNKTION unnest_2d_1d(anyarray) RETURERER SÆT AF anyarray AS$func$SELECT array_agg($1[d1][d2])FRA gener_subscripts($1,1) d1 , gener_subscripts($1,2) d1ORGROUP BY AF d1$func$ LANGUAGE sql IMUTABLE;
For Postgres-versioner <8.4, array_agg()
er ikke installeret som standard. Opret det først:
CREATE AGGREGATE array_agg(anyelement) (SFUNC=array_append, STYPE=anyarray, INITCOND='{}');
Også generate_subscripts()
er ikke født endnu. Brug i stedet:
...FROM gener_series(array_lower($1,1), array_upper($1,1)) d1 , gener_series(array_lower($1,2), array_upper($1,2)) d2...
Ring til:
VÆLG unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Resultat
{1,2}{3,4}{5,6}
SQL Fiddle.