PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment sélectionner un tableau 1d à partir d'un tableau 2d?

Pour obtenir la première tranche d'un tableau :

SELECT my_arr[1:1];

Le tableau résultant a les mêmes dimensions de tableau comme entrée.
Détails dans ma réponse précédente ici :

  • Désimbriquer le tableau d'un niveau

Pour aplatir le résultat :

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

Ou plus propre :

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

Exemples

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

Résultat :

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

Ou :

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

Résultat :

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

Émuler unnest() dans Postgres 8.3

Réponse à votre commentaire :
La page Wiki vers laquelle vous vous connectez était un peu trompeuse. Je l'ai mis à jour avec du code pour les tableaux à 2 dimensions.

unnest() pour un tableau à une dimension :

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() pour un tableau à 2 dimensions :

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 fonction d'agrégation array_agg() n'est pas installé par défaut dans Postgres 8.3 :

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

Désimbriquer un tableau 2d en tableaux 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;

Violon SQL.