Обяснете
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
връща същото като
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
което е NULL. Цитирам документите по този въпрос:
По подразбиране долната граница на индексната стойност на размерите на масива се задава на единица.
0
няма специално значение тук. Освен това, с двуизмерни масиви, имате нужда от два индекса за да получите основен елемент. Като това:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Резултат:
2
Първата част от съобщението ви е малко неясна.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Резултат:
[1:3][1:3]
Това са две размери с 3 елемента (1 до 3) всеки (9 основни елемента).
Ако искате n-1
размери, то това е правилен резултат:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Резултат:
{1,2,3,4,5,6,7,8,9}
Това еедно измерение. unnest()
винаги произвежда един основен елемент на ред. Не съм сигурен какъв точно резултат желаете. Вашият пример е просто още един двуизмерен масив с липсващ набор от къдрави скоби ... ?
{1,2,3}, {4,5,6}, {7,8,9}
Ако искате отрязък от масивата , опитайте тази нотация:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Резултат:
{{1,2,3},{4,5,6}}
Или това:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Резултат:
{{4,5}}
Засплескане резултатът (получете 1D масив):
- Как да изберете 1d масив от 2d масив postgresql
Прочетете повече в ръководството тук.
Функция
По-късният тест показа, че тази функция plpgsql е много по-бързо. Изисква Postgres 9.1 или по-нова версия:
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;
Вижте:
- Как бързо да премахнете 2d масив в 1d масив в PostgreSQL?
Това е подобрена и опростена версия на функцията, която Лукас публикува:
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;
За версии на Postgres <8.4, array_agg()
не е инсталиран по подразбиране. Първо го създайте:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Също така, generate_subscripts()
все още не е роден. Използвайте вместо това:
...
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
...
Обадете се:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Резултат
{1,2}
{3,4}
{5,6}
SQL Fiddle.