Pergunta

SELECT UNNEST(ARRAY[1,2,3,4])

Ao executar a consulta acima, obtive o erro como este:

ERROR: function unnest(integer[]) does not exist in postgresql.

Estou usando PostgreSQL 8.3 e instalei o pacote _int.sql em meu banco de dados para operação de matriz de inteiros.

Como resolver esse erro?

Foi útil?

Solução

unnest() não faz parte do módulo intarray, mas do PostgreSQL padrão. No entanto, você precisa da versão 8.4 ou mais tarde para isso.

Portanto, você pode resolver isso atualizando para uma versão mais recente, de preferência a versão 9.1 atual. Consulte a política de controle de versão do projeto PostgreSQL .

Se você deveria usar o banco de dados compartilhado do Heroku, que atualmente usa a versão 8.3, eles também estão pensando em atualizá-lo. Heroku Labs já oferece 9.1 .


Como @Abdul comentou, você pode implementar o unnest() de um homem pobre em versões anteriores ao PostgreSQL 8.4 por conta própria:

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 usa matrizes com dimensões múltiplas):

SELECT unnest('{1,2,3,4}'::int[])  -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[])  -- fails! (returns all NULLs)

Você poderia implementar mais funções para matrizes 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;

Ligue para:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top