unnest()
nie jest częścią modułu intarray
, ale standardowego PostgreSQL. Jednak potrzebujesz wersji 8.4 lub później
za to.
Możesz więc rozwiązać ten problem, aktualizując do nowszej wersji, najlepiej do obecnej wersji 9.1. Zobacz politykę wersjonowania projektu PostgreSQL .
Jeśli powinieneś korzystać ze współdzielonej bazy danych Heroku, która obecnie korzysta z wersji 8.3, oni również zastanawiają się nad aktualizacją. Heroku Labs oferuje już wersję 9.1 .
Jak skomentował @Abdul, możesz zaimplementować unnest()
biednego człowieka w wersjach przed PostgreSQL 8.4 samodzielnie:
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;
Należy jednak pamiętać, że działa to tylko w przypadku tablic jednowymiarowych . (W przeciwieństwie do unnest()
PostgreSQLa) który przyjmuje tablice o wielu wymiarach):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
możesz zaimplementuj więcej funkcji dla tablic n-wymiarowych:
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;
Zadzwoń:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Możesz także napisać funkcję PL/pgSQL, która zajmuje się wieloma wymiarami...