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

Désimbriquer le tableau d'un niveau

Expliquez

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

renvoie le même que

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

qui est NUL. Je cite les docs à ce sujet :

Par défaut, la valeur d'index de la limite inférieure des dimensions d'un tableau est définie sur un.

0 n'a pas de signification particulière ici. De plus, avec un tableau à deux dimensions, vous avez besoin de deux index pour obtenir un élément de base. Comme ceci :

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

Résultat :

2

La première partie de votre message manque un peu de clarté.

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

Résultat :

[1:3][1:3]

C'est deux dimensions avec 3 éléments (1 à 3) chacun (9 éléments de base).
Si vous voulez n-1 dimensions, alors ceci est un résultat correct :

SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))

Résultat :

{1,2,3,4,5,6,7,8,9}

C'est un dimension. unnest() produit toujours un élément de base par ligne. Je ne sais pas exactement quel résultat vous désirez. Votre exemple est juste un autre tableau à 2 dimensions avec un ensemble manquant d'accolades ... ?

{1,2,3}, {4,5,6}, {7,8,9}

Si vous voulez une tranche du tableau , essayez cette notation :

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

Résultat :

{{1,2,3},{4,5,6}}

Ou ceci :

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

Résultat :

{{4,5}}

Pour aplatir le résultat (obtenir un tableau 1D):

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

En savoir plus dans le manuel ici.

Fonction

Un test ultérieur a révélé que cette fonction plpgsql est beaucoup plus rapide. Nécessite Postgres 9.1 ou version ultérieure :

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$  LANGUAGE plpgsql IMMUTABLE;

Voir :

  • Comment désimbriquer rapidement un tableau 2d dans un tableau 1d dans PostgreSQL ?

Ceci est une version améliorée et simplifiée de la fonction publiée par Lukas :

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

Pour les versions Postgres <8.4, array_agg() n'est pas installé par défaut. Créez-le d'abord :

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

Aussi, generate_subscripts() n'est pas encore né. Utilisez à la place :

...
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
...

Appel :

SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);

Résultat

{1,2}
{3,4}
{5,6}

SQL Fiddle.