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.