unnest()
не е част от модула intarray
, но на стандартния PostgreSQL. Вие обаче имате нужда от версия 8.4силен> или по-късно
за това.
Така че можете да разрешите това, като надстроите до по-нова версия, за предпочитане текущата версия 9.1. Вижте правилата за версии на проекта PostgreSQL .
Ако трябва да използвате споделената база данни на Heroku, която в момента използва версия 8.3, те също търсят надстройка. Heroku Labs вече предлага 9.1 .
Както @Abdul коментира, можете да приложите unnest()
на беден човек във версии преди PostgreSQL 8.4 себе си:
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;
Имайте предвид обаче, че това работи само за едномерни масиви . (За разлика от unnest()
на PostgreSQL който приема масиви с множество измерения):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Вие можете прилага повече функции за n-мерни масиви:
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;
Обаждане:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Можете също така да напишете PL/pgSQL функция, която се занимава с множество измерения...