PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

FEHLER:Funktion unnest(integer[]) existiert nicht in postgresql

unnest() ist nicht Teil des Moduls intarray , aber von Standard-PostgreSQL. Sie benötigen jedoch Version 8.4 oder später dafür.

Sie können dies also beheben, indem Sie auf eine neuere Version aktualisieren, vorzugsweise auf die aktuelle Version 9.1. Siehe Versionierungsrichtlinie des PostgreSQL-Projekts .

Falls Sie die gemeinsam genutzte Datenbank von Heroku verwenden sollten, die derzeit Version 8.3 verwendet, prüfen sie ebenfalls ein Upgrade. Heroku Labs bietet bereits 9.1 an .

Wie @Abdul kommentierte, können Sie das unnest() eines armen Mannes implementieren in Versionen vor PostgreSQL 8.4 selbst:

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;

Beachten Sie jedoch, dass dies nur für eindimensionale Arrays funktioniert . (Im Gegensatz zu unnest() von PostgreSQL die Arrays mit mehreren Dimensionen akzeptiert):

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

Sie könnten weitere Funktionen für n-dimensionale Arrays implementieren:

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;

Aufruf:

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

Sie könnten auch eine PL/pgSQL-Funktion schreiben, die mehrere Dimensionen verarbeitet ...