Domanda

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

Durante l'esecuzione della query precedente ho ricevuto l'errore come questo:

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

Utilizzo PostgreSQL 8.3 e ho installato il pacchetto _int.sql nel mio database per operazioni con array di interi.

Come risolvere questo errore?

È stato utile?

Soluzione

unnest() non fa parte del modulo intarray, ma del PostgreSQL standard. Tuttavia, è necessaria la versione 8.4 o versioni successive per questo.

Quindi puoi risolvere questo problema aggiornando a una versione più recente, preferibilmente la versione corrente 9.1. Consulta la politica di controllo delle versioni del progetto PostgreSQL .

Se dovresti utilizzare il database condiviso di Heroku, che attualmente utilizza la versione 8.3, anche loro stanno cercando di aggiornarlo. Heroku Labs offre già 9.1 .


Come ha commentato @Abdul, puoi implementare il unnest() di un uomo povero nelle versioni precedenti a PostgreSQL 8.4 da solo:

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;

Tuttavia, tieni presente che funziona solo per array unidimensionali . (A differenza del unnest() di PostgreSQL che accetta array con più dimensioni):

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

Potresti implementare più funzioni per array n-dimensionali:

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;

Chiama:

SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[])  -- works!

Potresti anche scrivere una funzione PL / pgSQL che si occupa di più dimensioni ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top