SELECT UNNEST(ARRAY[1,2,3,4])
执行上述查询时,我得到了如下错误:
ERROR: function unnest(integer[]) does not exist in postgresql.
我正在使用PostgreSQL 8.3,我在我的db中安装了_int.sql
包,用于整数数组操作。
如何解决此错误?
答案 0 :(得分:6)
unnest()
不是模块intarray
的一部分,而是标准PostgreSQL的一部分。但是,你为此need version 8.4 or later。
因此,您可以通过升级到更新版本(最好是当前版本9.1)来解决此问题。请参阅versioning policy of the PostgreSQL project。
如果你应该使用目前使用版本8.3的Heroku的共享数据库,他们也在考虑升级。 Heroku Labs already offers 9.1
正如@Abdul评论的那样,你可以自己在PostgreSQL 8.4之前的版本中实现一个穷人的unnest()
:
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;
但是,请注意,这仅适用于一维数组。 (与PostgreSQL的unnest()
相反,后者采用多维度的数组):
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函数...