sql >> Base de Datos >  >> RDS >> PostgreSQL

ERROR:la función unnest (entero []) no existe en postgresql

unnest() no es parte del módulo intarray , pero de PostgreSQL estándar. Sin embargo, necesita la versión 8.4 o más tarde por eso.

Entonces, puede resolver esto actualizando a una versión más reciente, preferiblemente la versión actual 9.1. Consulte la política de control de versiones del proyecto PostgreSQL .

Si debería usar la base de datos compartida de Heroku, que actualmente usa la versión 8.3, también están buscando actualizarla. Heroku Labs ya ofrece 9.1 .

Como comentó @Abdul, puede implementar unnest() de un hombre pobre en versiones anteriores a PostgreSQL 8.4 usted mismo:

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;

Sin embargo, tenga en cuenta que esto solo funciona para matrices unidimensionales . (A diferencia de unnest() de PostgreSQL que toma arreglos con múltiples dimensiones):

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

podrías implementar más funciones para arreglos n-dimensionales:

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;

Llamar:

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

También podría escribir una función PL/pgSQL que trate con múltiples dimensiones...