unnest()
não faz parte do módulo intarray
, mas do PostgreSQL padrão. No entanto, você precisa da versão 8.4 ou posterior
por isso. Portanto, você pode resolver isso atualizando para uma versão mais recente, de preferência a versão atual 9.1. Consulte a política de versionamento do projeto PostgreSQL .
Se você estiver usando o banco de dados compartilhado do Heroku, que atualmente usa a versão 8.3, eles também estão pensando em atualizar. Heroku Labs já oferece 9.1 .
Como @Abdul comentou, você pode implementar o
unnest()
de um pobre homem em versões anteriores ao PostgreSQL 8.4 você mesmo: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;
No entanto, esteja ciente de que isso só funciona para matrizes unidimensionais . (Ao contrário do
unnest()
do PostgreSQL que recebe arrays com várias dimensões):SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Você poderia implemente mais funções para arrays n-dimensionais:
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;
Ligar:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Você também pode escrever uma função PL/pgSQL que lida com várias dimensões ...