PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como selecionar a matriz 1d da matriz 2d?


Para obter a primeira fatia de uma matriz:
SELECT my_arr[1:1];

A matriz resultante tem as mesmas dimensões de matriz como entrada.
Detalhes na minha resposta anterior aqui:
  • Desaninhar array em um nível

Para achatar o resultado:
SELECT ARRAY(SELECT unnest(my_arr[1:1]));

Ou mais limpo:
SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));

Exemplos

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];

Resultado:
{{1,2,3}}  -- 2D array

Ou:
SELECT ARRAY(
   SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
   );

Resultado:
{1,2,3}  -- 1D array

Emular unnest() no Postgres 8.3


Resposta ao seu comentário:
A página Wiki para a qual você está linkando era um pouco enganosa. Eu atualizei com código para matrizes bidimensionais.

unnest() para matriz unidimensional:
CREATE OR REPLACE FUNCTION unnest_1d(anyarray)
  RETURNS SETOF anyelement AS
$func$
SELECT $1[i]
FROM   generate_series(array_lower($1,1), array_upper($1,1)) i
$func$  LANGUAGE sql IMMUTABLE;

unnest() para matriz bidimensional:
CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
  RETURNS SETOF anyelement AS
$func$
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
$func$  LANGUAGE sql IMMUTABLE;

A função agregada array_agg() não está instalado por padrão no Postgres 8.3:
CREATE AGGREGATE array_agg(anyelement) (
 SFUNC = array_append,
 STYPE = anyarray,
 INITCOND = '{}'
);

Desaninhar array 2d para arrays 1d:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
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
$func$  LANGUAGE sql IMMUTABLE;

violino SQL.