Wyjaśnij
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
zwraca to samo co
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
co jest NULL. Cytuję dokumenty w tej sprawie:
Domyślnie dolna granica wartości indeksu wymiarów tablicy jest ustawiona na jeden.
0
nie ma tu żadnego specjalnego znaczenia. Ponadto, w przypadku tablic dwuwymiarowych, potrzebujesz dwóch indeksów aby uzyskać element bazowy. Tak:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Wynik:
2
Pierwsza część Twojej wiadomości jest nieco niejasna.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Wynik:
[1:3][1:3]
To dwa wymiary z 3 elementami (1 do 3) każdy (9 elementów podstawowych).
Jeśli chcesz n-1
wymiary to jest to poprawny wynik:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Wynik:
{1,2,3,4,5,6,7,8,9}
To jeden wymiar. unnest()
zawsze wytwarza jeden element bazowy w rzędzie. Nie jestem pewien , jakiego dokładnie rezultatu oczekujesz . Twój przykład to tylko kolejna dwuwymiarowa tablica z brakującym zestawem nawiasów klamrowych... ?
{1,2,3}, {4,5,6}, {7,8,9}
Jeśli chcesz wycinek tablicy , wypróbuj ten zapis:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Wynik:
{{1,2,3},{4,5,6}}
Albo to:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Wynik:
{{4,5}}
Aby spłaszczyć wynik (uzyskaj tablicę 1D):
- Jak wybrać tablicę 1d z tablicy 2d postgresql
Przeczytaj więcej w instrukcji tutaj.
Funkcja
Późniejszy test wykazał, że ta funkcja plpgsql to dużo szybciej. Wymaga Postgresa 9.1 lub nowszego:
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;
Zobacz:
- Jak szybko rozpakować tablicę 2d w tablicę 1d w PostgreSQL?
To jest ulepszona i uproszczona wersja funkcji opublikowanej przez Lukasa:
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;
Dla wersji Postgresa <8.4, array_agg()
nie jest instalowany domyślnie. Utwórz najpierw:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Ponadto generate_subscripts()
jeszcze się nie urodził. Użyj zamiast:
...
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
...
Zadzwoń:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Wynik
{1,2}
{3,4}
{5,6}
Skrzypce SQL.