PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ERRO:a função unnest(integer[]) não existe no postgresql


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 ...