postgresql - 错误 : function unnest(integer[]) does not exist in postgresql

标签 postgresql rails-postgresql postgresql-9.0 postgresql-8.4

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

在执行上面的查询时,我得到了这样的错误:

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

我正在使用 PostgreSQL 8.3 并且我已经在我的数据库中安装了 _int.sql 包以进行整数数组操作。

如何解决这个错误?

最佳答案

unnest() 不是模块 intarray 的一部分,而是标准 PostgreSQL 的一部分。然而,你need Postgres 8.4 or later为此。

所以你可以通过升级到更新的版本来解决这个问题。查看versioning policy of the PostgreSQL project .

这是 Postgres 8.4 的穷人 unnest():

CREATE OR REPLACE FUNCTION unnest(anyarray)
  RETURNS SETOF anyelement
  LANGUAGE sql IMMUTABLE AS
'SELECT $1[i] FROM generate_series(array_lower($1,1), array_upper($1,1)) i';

仅适用于一维数组 - 与现代 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
  LANGUAGE sql IMMUTABLE AS
$func$
SELECT $1[i][j]
FROM  (
   SELECT i, generate_series(array_lower($1,2), array_upper($1,2)) AS j
   FROM   generate_series(array_lower($1,1), array_upper($1,1)) i
   ) sub;
$func$;

调用:

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

您还可以编写处理多个维度的 PL/pgSQL 函数......

关于postgresql - 错误 : function unnest(integer[]) does not exist in postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8830517/

相关文章:

sql - 如果 condition1 为真,则将一个表与一个表连接,如果条件 1 为假,则与另一个表连接?

postgresql - 在 PostgreSQL 中使用 bool 值索引所有 JSONB 字段的最佳方法

ruby-on-rails - PostgreSQL 查找记录并按左外连接排序

ruby-on-rails - Rails 范围 : Select Distinct Title With Values

sql - Rails、ActiveRecord 和子查询

regex - 带正则表达式的 CASE : "set-valued function called in context that cannot accept a set"

sql - ILIKE 匹配单词边界 PostgreSQL 9

mysql - 抽取 Assets :precompile

ruby - 新 rvm/ruby/pg/rails 设置的最佳安装流程

linux - Postgresql 用户 "postgres"需要密码才能创建数据库