Vysvětlete
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
vrátí totéž jako
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
což je NULL. Cituji dokumenty k této záležitosti:
Ve výchozím nastavení je dolní mezní hodnota indexu rozměrů pole nastavena na jedna.
0
zde nemá žádný zvláštní význam. Také u dvourozměrných polí potřebujete dva indexy získat základní prvek. Takhle:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Výsledek:
2
První část vaší zprávy je trochu nejasná.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Výsledek:
[1:3][1:3]
To jsou dva rozměry se 3 prvky (1 až 3), každý (9 základních prvků).
Pokud chcete n-1
rozměry, pak je to správný výsledek:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Výsledek:
{1,2,3,4,5,6,7,8,9}
To je jedna dimenze. unnest()
vždy vytvoří jeden základní prvek na řádek. Nejsem si jistý, jaký výsledek přesně si přejete. Váš příklad je jen další 2-rozměrné pole s chybějící sadou složených závorek ... ?
{1,2,3}, {4,5,6}, {7,8,9}
Pokud chcete část pole , zkuste tento zápis:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Výsledek:
{{1,2,3},{4,5,6}}
Nebo toto:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Výsledek:
{{4,5}}
Chcete-li vyrovnat výsledek (získáte 1D pole):
- Jak vybrat 1d pole z 2d pole postgresql
Přečtěte si více v příručce zde.
Funkce
Pozdější test odhalil, že tato funkce plpgsql je hodně rychlejší. Vyžaduje Postgres 9.1 nebo novější:
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;
Viz:
- Jak rychle zrušit vnoření 2D pole do 1D pole v PostgreSQL?
Toto je vylepšená a zjednodušená verze funkce, kterou Lukas zveřejnil:
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;
Pro Postgres verze <8.4, array_agg()
není standardně nainstalován. Nejprve jej vytvořte:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Také generate_subscripts()
se ještě nenarodil. Místo toho použijte:
...
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
...
Volejte:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Výsledek
{1,2}
{3,4}
{5,6}
SQL Fiddle.