Объяснять
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}}
To Свести Результат (получить массив 1D):
Подробнее в руководстве здесь .
Функция
Более поздний тест показал, что эта функция 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;
См:
Это улучшенная и упрощенная версия функции, которую Лукас разместил :
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, <code>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.