sql >> Databasteknik >  >> RDS >> PostgreSQL

FEL:funktionen unnest(heltal[]) finns inte i postgresql

unnest() är inte en del av modulen intarray , men av standard PostgreSQL. Du behöver dock version 8.4 stark> eller senare för det.

Så du kan lösa detta genom att uppgradera till en nyare version, helst den nuvarande versionen 9.1. Se versionspolicyn för PostgreSQL-projektet .

Om du skulle använda Herokus delade databas, som för närvarande använder version 8.3, undersöker de också uppgradering. Heroku Labs erbjuder redan 9.1 .

Som @Abdul kommenterade kan du implementera en fattig mans unnest() i versioner före PostgreSQL 8.4 själv:

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;

Tänk dock på att detta bara fungerar för endimensionella arrayer . (I motsats till PostgreSQL:s unnest() som tar arrayer med flera dimensioner):

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

Du kunde implementera fler funktioner för n-dimensionella arrayer:

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:

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

Du kan också skriva en PL/pgSQL-funktion som hanterar flera dimensioner ...




  1. ODP.NET UPPDATERING... ÅTERKOMMER INTO... flera rader, Parametertyp

  2. Markörer med postgres, var lagras data och hur många anrop till DB

  3. DISTINCT med två array_agg (eller en array_agg med tupel inuti)?

  4. hur man sparar data från csv-fil till databas med php