unnest()
non fa parte del modulo intarray
, ma di PostgreSQL standard. Tuttavia, è necessaria la versione 8.4 o più tardi
per quello.
Quindi puoi risolvere questo problema aggiornando a una versione più recente, preferibilmente la versione corrente 9.1. Consulta la politica di versione del progetto PostgreSQL .
Se dovresti utilizzare il database condiviso di Heroku, che attualmente utilizza la versione 8.3, stanno esaminando anche l'aggiornamento. Heroku Labs offre già 9.1 .
Come ha commentato @Abdul, puoi implementare il unnest()
di un povero uomo nelle versioni precedenti a PostgreSQL 8.4 tu stesso:
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;
Tuttavia, tieni presente che questo funziona solo per array unidimensionali . (Al contrario di unnest()
di PostgreSQL che accetta array con più dimensioni):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Potresti implementare più funzioni per array n-dimensionali:
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;
Chiama:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Potresti anche scrivere una funzione PL/pgSQL che si occupa di più dimensioni ...