sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo seleccionar una matriz 1d de una matriz 2d?

Para obtener el primer segmento de una matriz:

SELECT my_arr[1:1];

La matriz resultante tiene las mismas dimensiones de matriz como entrada.
Detalles en mi respuesta anterior aquí:

  • Desanida la matriz en un nivel

Para aplanar el resultado:

SELECT ARRAY(SELECT unnest(my_arr[1:1]));

O limpiador:

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

Ejemplos

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

Resultado:

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

O:

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

Resultado:

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

Emula unnest() en Postgres 8.3

Respuesta a su comentario:
La página Wiki a la que está enlazando era un poco engañosa. Lo actualicé con código para arreglos bidimensionales.

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;

La función agregada array_agg() no está instalado por defecto en Postgres 8.3:

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC = array_append,
 STYPE = anyarray,
 INITCOND = '{}'
);

Desanime de arreglos 2d a arreglos 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;

Violín SQL.