sql >> Database >  >> RDS >> PostgreSQL

FOUT:functie unnest(integer[]) bestaat niet in postgresql

unnest() maakt geen deel uit van de module intarray , maar van standaard PostgreSQL. Je hebt echter versie 8.4 of later daarvoor.

U kunt dit dus oplossen door te upgraden naar een recentere versie, bij voorkeur de huidige versie 9.1. Zie het versiebeleid van het PostgreSQL-project .

Als je Heroku's gedeelde database zou moeten gebruiken, die momenteel versie 8.3 gebruikt, zijn ze ook aan het overwegen om te upgraden. Heroku Labs biedt al 9.1 .

Zoals @Abdul opmerkte, kun je unnest() van een arme man implementeren in versies vóór PostgreSQL 8.4 zelf:

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;

Houd er echter rekening mee dat dit alleen werkt voor eendimensionale arrays . (In tegenstelling tot PostgreSQL's unnest() die arrays met meerdere dimensies nodig heeft):

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

Je zou implementeer meer functies voor n-dimensionale 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;

Bel:

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

Je zou ook een PL/pgSQL-functie kunnen schrijven die meerdere dimensies behandelt ...




  1. waar gaat de output van system.out.println naar de oracle java-klasse?

  2. Voeg u:mm pm/am-tijdformaat in de database in met behulp van MYSQL

  3. Cloud SQL- of VM-instantie om MySQL-database te hosten

  4. ECHO MYSQL RESULTAAT WEERGAVE LEGE PAGINA