unnest()
ist nicht Teil des Moduls intarray
, aber von Standard-PostgreSQL. Sie benötigen jedoch Version 8.4 oder später
dafür.
Sie können dies also beheben, indem Sie auf eine neuere Version aktualisieren, vorzugsweise auf die aktuelle Version 9.1. Siehe Versionierungsrichtlinie des PostgreSQL-Projekts .
Falls Sie die gemeinsam genutzte Datenbank von Heroku verwenden sollten, die derzeit Version 8.3 verwendet, prüfen sie ebenfalls ein Upgrade. Heroku Labs bietet bereits 9.1 an .
Wie @Abdul kommentierte, können Sie das unnest()
eines armen Mannes implementieren in Versionen vor PostgreSQL 8.4 selbst:
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;
Beachten Sie jedoch, dass dies nur für eindimensionale Arrays funktioniert . (Im Gegensatz zu unnest()
von PostgreSQL die Arrays mit mehreren Dimensionen akzeptiert):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Sie könnten weitere Funktionen für n-dimensionale Arrays implementieren:
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;
Aufruf:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Sie könnten auch eine PL/pgSQL-Funktion schreiben, die mehrere Dimensionen verarbeitet ...