sql >> Databáze >  >> RDS >> PostgreSQL

CHYBA:funkce unnest(integer[]) v postgresql neexistuje

unnest() není součástí modulu intarray , ale standardní PostgreSQL. Musíte však verzi 8.4 nebo později za to.

Takže to můžete vyřešit upgradem na novější verzi, nejlépe aktuální verzi 9.1. Viz zásady verzování projektu PostgreSQL .

Pokud byste měli používat sdílenou databázi Heroku, která aktuálně používá verzi 8.3, zvažují také upgrade. Heroku Labs již nabízí 9.1 .

Jak poznamenal @Abdul, můžete implementovat unnest() chudáka ve verzích před PostgreSQL 8.4 sami:

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;

Mějte však na paměti, že to funguje pouze pro jednorozměrná pole . (Na rozdíl od PostgreSQL unnest() který přebírá pole s více rozměry):

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

Mohli byste implementovat více funkcí pro n-rozměrná pole:

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;

Volejte:

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

Můžete také napsat funkci PL/pgSQL, která se zabývá více dimenzemi ...




  1. Správný způsob ukládání položek s filtrovatelnými atributy?

  2. Postup:Vytvořte spouštěč pro datum změny automatické aktualizace pomocí SQL Server 2008

  3. Kde si mohu stáhnout ukázkovou databázi Mysql?

  4. neplatná chyba spouštěče