Pregunta

SELECT UNNEST(ARRAY[1,2,3,4])

Al ejecutar la consulta anterior, recibí un error como este:

ERROR: function unnest(integer[]) does not exist in postgresql.

Estoy usando PostgreSQL 8.3 y he instalado el _int.sql paquete en mi base de datos para la operación de matriz de enteros.

¿Cómo resolver este error?

¿Fue útil?

Solución

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

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

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


Como comentó @Abdul, puedes implementar la estrategia de un hombre pobre. unnest() 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 sólo funciona para matrices unidimensionales.(A diferencia de PostgreSQL unnest() que toma matrices 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ía implementar más funciones para matrices de n dimensiones:

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 se ocupe de múltiples dimensiones...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top