ERROR: function unnest (integer []) não existe no postgresql
-
27-10-2019 - |
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?
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 ...