ОШИБКА: функция unnest (integer []) не существует в postgresql - PullRequest
2 голосов
/ 12 января 2012
SELECT UNNEST(ARRAY[1,2,3,4])

При выполнении вышеприведенного запроса я получил сообщение об ошибке:

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

Я использую PostgreSQL 8.3 и установил пакет _int.sql в свою базу данных для работы с целочисленным массивом.

Как устранить эту ошибку?

1 Ответ

6 голосов
/ 12 января 2012

unnest() не является частью модуля intarray, но стандартного PostgreSQL. Однако вам нужна версия 8.4 или более поздняя для этого.

Таким образом, вы можете решить эту проблему путем обновления до более поздней версии, предпочтительно до текущей версии 9.1. См. политику версий проекта PostgreSQL .

Если вы должны использовать общую базу данных Heroku, которая в настоящее время использует версию 8.3, они также рассматривают возможность обновления. Heroku Labs уже предлагает 9,1 .


Как прокомментировал @Abdul, вы можете реализовать unnest() для бедняков в версиях до PostgreSQL 8.4 самостоятельно:

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;

Однако учтите, что это работает только для одномерных массивов . (В отличие от unnest() PostgreSQL, который принимает массивы с несколькими измерениями):

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

Вы могли бы реализовать больше функций для n-мерных массивов:

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;

Звоните:

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

Вы также можете написать функцию PL / pgSQL, которая работает с несколькими измерениями ...

...