unnest()
není součástí modulu intarray
, ale standardní PostgreSQL. Musíte však verzi 8.4 nebo později
za to.
Takže to můžete vyřešit upgradem na novější verzi, nejlépe aktuální verzi 9.1. Viz zásady verzování projektu PostgreSQL .
Pokud byste měli používat sdílenou databázi Heroku, která aktuálně používá verzi 8.3, zvažují také upgrade. Heroku Labs již nabízí 9.1 .
Jak poznamenal @Abdul, můžete implementovat unnest()
chudáka ve verzích před PostgreSQL 8.4 sami:
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;
Mějte však na paměti, že to funguje pouze pro jednorozměrná pole . (Na rozdíl od PostgreSQL unnest()
který přebírá pole s více rozměry):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Mohli byste implementovat více funkcí pro n-rozměrná pole:
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;
Volejte:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Můžete také napsat funkci PL/pgSQL, která se zabývá více dimenzemi ...