PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come selezionare l'array 1d dall'array 2d?

Per ottenere la prima fetta di un array:

SELECT my_arr[1:1];

L'array risultante ha le stesse dimensioni dell'array come input.
Dettagli nella mia risposta precedente qui:

  • Unnest array di un livello

Per appiattire il risultato:

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

O più pulito:

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

Esempi

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

Risultato:

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

Oppure:

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

Risultato:

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

Emula unnest() in Postgres 8.3

Risposta al tuo commento:
La pagina Wiki a cui ti stai collegando era un po' fuorviante. L'ho aggiornato con il codice per gli array bidimensionali.

unnest() per array unidimensionale:

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() per array bidimensionale:

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 funzione di aggregazione array_agg() non è installato per impostazione predefinita in Postgres 8.3:

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

Annulla l'annidamento dell'array 2d in array 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;

SQL Violino.