sql >> Database teknologi >  >> RDS >> PostgreSQL

FEJL:funktion unnest(heltal[]) findes ikke i postgresql

unnest() er ikke en del af modulet intarray , men af ​​standard PostgreSQL. Du skal dog bruge version 8.4 stærk> eller senere for det.

Så du kan løse dette ved at opgradere til en nyere version, helst den nuværende version 9.1. Se versioneringspolitikken for PostgreSQL-projektet .

Hvis du skulle bruge Herokus delte database, som i øjeblikket bruger version 8.3, kigger de også på opgradering. Heroku Labs tilbyder allerede 9.1 .

Som @Abdul kommenterede, kan du implementere en fattig mands unnest() i versioner før PostgreSQL 8.4 selv:

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;

Vær dog opmærksom på, at dette kun virker for en-dimensionelle arrays . (I modsætning til PostgreSQL's unnest() som tager arrays med flere dimensioner):

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

Du kunne implementere flere funktioner til n-dimensionelle arrays:

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;

Ring til:

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

Du kan også skrive en PL/pgSQL-funktion, der beskæftiger sig med flere dimensioner ...




  1. Postgres - opdateringserklæring som en trigger

  2. De mest populære databasestyringssystemer i verden

  3. forbundet med måneder

  4. ORA-00904:Godt feriested:ugyldig identifikator