Frage

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

Beim Ausführen der obigen Abfrage wurde der folgende Fehler angezeigt:

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

Ich verwende PostgreSQL 8.3 und habe das Paket _int.sql für den Integer-Array-Betrieb in meiner Datenbank installiert.

Wie kann dieser Fehler behoben werden?

War es hilfreich?

Lösung

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

Sie können dieses Problem beheben, indem Sie auf eine neuere Version aktualisieren, vorzugsweise auf die aktuelle Version 9.1. Weitere Informationen finden Sie in der Versionsrichtlinie des PostgreSQL-Projekts .

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


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

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 PostgreSQLs unnest(), der Arrays mit mehreren Dimensionen verwendet):

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;

Anruf:

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

Sie können auch eine PL / pgSQL-Funktion schreiben, die sich mit mehreren Dimensionen befasst ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top