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

ERREUR :la fonction unnest(integer[]) n'existe pas dans postgresql

unnest() ne fait pas partie du module intarray , mais de PostgreSQL standard. Cependant, vous avez besoin de la version 8.4 ou plus tard pour ça.

Vous pouvez donc résoudre ce problème en mettant à niveau vers une version plus récente, de préférence la version actuelle 9.1. Voir la politique de gestion des versions du projet PostgreSQL .

Si vous devez utiliser la base de données partagée de Heroku, qui utilise actuellement la version 8.3, ils envisagent également une mise à niveau. Heroku Labs propose déjà la version 9.1 .

Comme @Abdul l'a commenté, vous pouvez implémenter le unnest() d'un pauvre homme dans les versions antérieures à PostgreSQL 8.4 vous-même :

CREATE OR REPLACE FUNCTION unnest(anyarray)
  RETURNS SETOF anyelement AS
$BODY$
   SELECT $1[i] FROM generate_series(array_lower($1,1), array_upper($1,1)) i;
$BODY$ LANGUAGE sql IMMUTABLE;

Cependant, sachez que cela ne fonctionne que pour les tableaux unidimensionnels . (Par opposition à unnest() de PostgreSQL qui prend des tableaux à plusieurs dimensions) :

SELECT unnest('{1,2,3,4}'::int[])  -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[])  -- fails! (returns all NULLs)

Vous pourriez implémentez plus de fonctions pour les tableaux à n dimensions :

CREATE OR REPLACE FUNCTION unnest2(anyarray) -- for 2-dimensional arrays
  RETURNS SETOF anyelement AS
$BODY$
SELECT $1[i][j]
FROM  (
    SELECT i, generate_series(array_lower($1,2), array_upper($1,2)) j
    FROM  (
        SELECT generate_series(array_lower($1,1), array_upper($1,1)) i
        ) x
    ) y;
$BODY$ LANGUAGE sql IMMUTABLE;

Appel :

SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[])  -- works!

Vous pouvez également écrire une fonction PL/pgSQL qui traite plusieurs dimensions...