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...