Как выбрать 1d массив из 2d массива postgresql
У меня есть 2d массив и хочу выбрать только первый его элемент, который является 1d массивом. Как я могу это сделать?
1 ответ
Решение
Чтобы получить первый фрагмент массива
SELECT my_arr[1:1];
Полученный массив имеет те же размеры массива, что и входные.
Подробности в моем предыдущем ответе здесь:
Чтобы сгладить результат:
SELECT ARRAY(SELECT unnest(my_arr[1:1]));
Или чище:
SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]))
Примеры
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];
Результат
{{1,2,3}} -- 2D array
Или же
SELECT ARRAY(
SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
);
Результат
{1,2,3} -- 1D array
Подражать unnest() в Postgres 8.3
Ответ на ваш комментарий:
Вики-страница, на которую вы ссылаетесь, вводит в заблуждение. Я обновил его и добавил код для 2-мерных массивов:
unnest()
для одномерного массива:
CREATE OR REPLACE FUNCTION unnest_1d(anyarray)
RETURNS SETOF anyelement AS
$BODY$
SELECT $1[i]
FROM generate_series(array_lower($1,1), array_upper($1,1)) i
$BODY$
LANGUAGE sql IMMUTABLE;
unnest()
для 2-мерного массива:
CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
RETURNS SETOF anyelement AS
$BODY$
SELECT $1[d1][d2]
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
$BODY$
LANGUAGE sql IMMUTABLE;
Агрегатная функция array_agg()
по умолчанию не установлен в pg 8.3:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Отнесите 2d массив к 1d массивам:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$BODY$
SELECT array_agg($1[d1][d2])
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
GROUP BY d1
ORDER BY d1
$BODY$
LANGUAGE sql IMMUTABLE;