我正在用PL/pgSQL开发一些存储过程,其中一些给我带来了一些问题.我正在开发的存储过程通过参数接收一个数组,我在FOR循环中使用它来获取它的所有元素.为了定义FOR循环的上限,我使用了array_length函数.

FOR i IN 1..array_length(array,1) LOOP

   --array[i] something in here

END LOOP;

当我给存储过程一个空数组时,问题就出现了.存储过程不是不进入循环,而是简单地返回一个错误,指出FOR循环的上限为NULL.不是应该是0吗?

我的FOR循环有什么问题吗?

当在其他循环中使用空数组而不使用空边界时?

Note:我知道我总是可以在循环之前使用一个条件,比如:

IF array_length(array,1) IS NOT NULL THEN

但问题是:这个过程应该能在最短的时间内处理数千个电话.因此,我不想让处理过程增加不必要的开销.我只是想看看是否有办法在循环中"循环"一个空array.

推荐答案

与往常一样,如果希望对空值有不同的行为,请使用coalesce构造:

FOR i IN 1..coalesce(array_length(array, 1), 0) LOOP
    RAISE NOTICE '%', array[i];
END LOOP;

至于返回值:array_length(x, N)返回Nth维中的元素数.因为空数组没有维度,所以它返回NULL.你是对的,如果你只考虑简单的数组,但是对于多维数组是有意义的,那么它是违反直觉的.

Edit:就像Erwin Brandstetter在 comments 中写道的那样,使用array_lower/upper循环数组索引更为正确.这些将适用于非基于1的array.这些参数也采用维度参数,需要合并:

FOR i IN coalesce(array_lower(array, 1), 1)..coalesce(array_upper(array, 1), 1) LOOP
    RAISE NOTICE '%', array[i];
END LOOP;

Postgresql相关问答推荐

此PostgreSQL汇总分组不适用于窗口表达式

Haskell仆人发布FormUrlEncode for(向量字符串)字段

用于JSON数组的带有组合条件的Postgres JSONB Select 查询

AGE Graph 实际上存储为 postgreSQL 表,对吧?如何检索该表(不是图表)?

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

找出两个表之间的差异

为什么在 PostgreSQL 中忽略查询超时?

用于生产的 Rails 性能调优?

将 Postgres 与 Grails 一起使用

保存 geodjango PointField 时出错

在 postgres 中删除所有共享相同前缀的表

如何在 psycopg2 中使用服务器端游标

SQL数据库表中的多态性?

为什么 sqlalchemy 的默认列值不起作用

如何从另一个脚本运行 postgres sql 脚本?

PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV

在 postgresql 中获取上个月的数据

在 pg_restore 期间排除表

在 docker-compose up 后加载 Postgres 转储

Select 后postgres更新