Uitleggen
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
geeft hetzelfde terug als
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
dat is NULL. Ik citeer de documenten hierover:
De indexwaarde van de ondergrens van de afmetingen van een array is standaard ingesteld op één.
0
heeft hier geen speciale betekenis. Ook heeft u bij tweedimensionale arrays twee indexen nodig om een basiselement te krijgen. Zoals dit:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Resultaat:
2
Het eerste deel van je bericht is een beetje onduidelijk.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Resultaat:
[1:3][1:3]
Dat zijn twee afmetingen met elk 3 elementen (1 tot 3) (9 basiselementen).
Als u n-1
. wilt afmetingen dan is dit een correct resultaat:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Resultaat:
{1,2,3,4,5,6,7,8,9}
Dat is één dimensie. unnest()
produceert altijd één basiselement per rij. Ik weet niet zeker welk resultaat u precies wenst. Uw voorbeeld is gewoon weer een 2-dimensionale array met een ontbrekende set accolades ... ?
{1,2,3}, {4,5,6}, {7,8,9}
Als u een deel van de array . wilt , probeer deze notatie:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Resultaat:
{{1,2,3},{4,5,6}}
Of dit:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Resultaat:
{{4,5}}
Om af te vlakken het resultaat (krijg een 1D-array):
- Hoe 1d-array te selecteren uit 2d-array postgresql
Lees hier meer in de handleiding.
Functie
Een latere test onthulde dat deze plpgsql-functie veel . is sneller. Vereist Postgres 9.1 of hoger:
CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
RETURNS SETOF ANYARRAY AS
$func$
BEGIN
FOREACH a SLICE 1 IN ARRAY $1 LOOP
RETURN NEXT;
END LOOP;
END
$func$ LANGUAGE plpgsql IMMUTABLE;
Zie:
- Hoe een 2D-array snel in PostgreSQL te unnesten in een 1d-array?
Dit is een verbeterde en vereenvoudigde versie van de functie die Lukas plaatste:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM generate_subscripts($1,1) d1
, generate_subscripts($1,2) d2
GROUP BY d1
ORDER BY d1
$func$ LANGUAGE sql IMMUTABLE;
Voor Postgres-versies <8.4, array_agg()
is niet standaard geïnstalleerd. Maak het eerst aan:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Ook generate_subscripts()
is nog niet geboren. Gebruik in plaats daarvan:
...
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
...
Bel:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Resultaat
{1,2}
{3,4}
{5,6}
SQL Fiddle.