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

上記のクエリを実行しているときに、次のようなエラーが発生しました。

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

PostgreSQL 8.3を使用しており_int.sql、整数配列操作用のパッケージをデータベースにインストールしました。

このエラーを解決するにはどうすればよいですか?

4

1 に答える 1

7

unnest()モジュールの一部ではありませんintarrayが、標準のPostgreSQLの一部です。ただし、そのためにはバージョン8.4以降が必要です。

したがって、より新しいバージョン、できれば現在のバージョン9.1にアップグレードすることで、これを解決できます。PostgreSQLプロジェクトのバージョン管理ポリシーを参照してください。

現在バージョン8.3を使用しているHerokuの共有データベースを使用する必要がある場合は、アップグレードも検討しています。HerokuLabsはすでに9.1を提供しています


unnest()@Abdulがコメントしたように、 PostgreSQL8.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;

ただし、これは1次元配列でのみ機能することに注意してください。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関数を作成することもできます...

于 2012-01-12T05:33:36.240 に答える