SELECT UNNEST(ARRAY[1,2,3,4])
执行上述查询时,出现如下错误:
ERROR: function unnest(integer[]) does not exist in postgresql.
我正在使用 PostgreSQL 8.3,并且我已经_int.sql
在我的数据库中安装了该包以进行整数数组操作。
如何解决此错误?
SELECT UNNEST(ARRAY[1,2,3,4])
执行上述查询时,出现如下错误:
ERROR: function unnest(integer[]) does not exist in postgresql.
我正在使用 PostgreSQL 8.3,并且我已经_int.sql
在我的数据库中安装了该包以进行整数数组操作。
如何解决此错误?
unnest()
不是模块的一部分intarray
,而是标准 PostgreSQL 的一部分。但是,您需要版本8.4或更高版本。
因此,您可以通过升级到更新的版本来解决这个问题,最好是当前版本 9.1。请参阅PostgreSQL 项目的版本控制政策。
如果你应该使用 Heroku 的共享数据库,它目前使用 8.3 版,他们也在考虑升级。Heroku Labs 已经提供 9.1。
unnest()
正如@Abdul 评论的那样,您可以自己在 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 函数......