Raf*_*fiu 3 postgresql rails-postgresql postgresql-9.0 postgresql-8.4
SELECT UNNEST(ARRAY[1,2,3,4])
Run Code Online (Sandbox Code Playgroud)
执行上面的查询时,我收到如下错误:
ERROR: function unnest(integer[]) does not exist in postgresql.
Run Code Online (Sandbox Code Playgroud)
我正在使用PostgreSQL 8.3,我已经_int.sql在我的db中安装了包用于整数数组操作.
如何解决此错误?
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;
Run Code Online (Sandbox Code Playgroud)
但是,请注意,这仅适用于一维数组.(unnest()与采用多维度数组的PostgreSQL相反):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
Run Code Online (Sandbox Code Playgroud)
您可以为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;
Run Code Online (Sandbox Code Playgroud)
呼叫:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
Run Code Online (Sandbox Code Playgroud)
您还可以编写一个处理多个维度的PL/pgSQL函数...
| 归档时间: |
|
| 查看次数: |
5798 次 |
| 最近记录: |