unnest()
maakt geen deel uit van de module intarray
, maar van standaard PostgreSQL. Je hebt echter versie 8.4 of later
daarvoor.
U kunt dit dus oplossen door te upgraden naar een recentere versie, bij voorkeur de huidige versie 9.1. Zie het versiebeleid van het PostgreSQL-project .
Als je Heroku's gedeelde database zou moeten gebruiken, die momenteel versie 8.3 gebruikt, zijn ze ook aan het overwegen om te upgraden. Heroku Labs biedt al 9.1 .
Zoals @Abdul opmerkte, kun je unnest()
van een arme man implementeren in versies vóór PostgreSQL 8.4 zelf:
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;
Houd er echter rekening mee dat dit alleen werkt voor eendimensionale arrays . (In tegenstelling tot PostgreSQL's unnest()
die arrays met meerdere dimensies nodig heeft):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Je zou implementeer meer functies voor n-dimensionale arrays:
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;
Bel:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Je zou ook een PL/pgSQL-functie kunnen schrijven die meerdere dimensies behandelt ...