unnest()
er ikke en del af modulet intarray
, men af standard PostgreSQL. Du skal dog bruge version 8.4 stærk> eller senere
for det.
Så du kan løse dette ved at opgradere til en nyere version, helst den nuværende version 9.1. Se versioneringspolitikken for PostgreSQL-projektet .
Hvis du skulle bruge Herokus delte database, som i øjeblikket bruger version 8.3, kigger de også på opgradering. Heroku Labs tilbyder allerede 9.1 .
Som @Abdul kommenterede, kan du implementere en fattig mands unnest()
i versioner før PostgreSQL 8.4 selv:
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;
Vær dog opmærksom på, at dette kun virker for en-dimensionelle arrays . (I modsætning til PostgreSQL's unnest()
som tager arrays med flere dimensioner):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Du kunne implementere flere funktioner til n-dimensionelle 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;
Ring til:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Du kan også skrive en PL/pgSQL-funktion, der beskæftiger sig med flere dimensioner ...