unnest()
är inte en del av modulen intarray
, men av standard PostgreSQL. Du behöver dock version 8.4 stark> eller senare
för det.
Så du kan lösa detta genom att uppgradera till en nyare version, helst den nuvarande versionen 9.1. Se versionspolicyn för PostgreSQL-projektet .
Om du skulle använda Herokus delade databas, som för närvarande använder version 8.3, undersöker de också uppgradering. Heroku Labs erbjuder redan 9.1 .
Som @Abdul kommenterade kan du implementera en fattig mans unnest()
i versioner före PostgreSQL 8.4 själv:
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;
Tänk dock på att detta bara fungerar för endimensionella arrayer . (I motsats till PostgreSQL:s unnest()
som tar arrayer med flera dimensioner):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Du kunde implementera fler funktioner för n-dimensionella arrayer:
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:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Du kan också skriva en PL/pgSQL-funktion som hanterar flera dimensioner ...