Как выбрать 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;

SQL Fiddle.

Другие вопросы по тегам