我正在PL / pgsql中开发一些存储的程序,其中一些是给我一些问题.我正在开发的sprocs通过参数我在FOR LOOP中使用的数组来获取其所有元素.要定义FOR LOOP的上限,我使用array_length函数.
FOR i IN 1..array_length(array,1) LOOP --array[i] something in here END LOOP;
当我给sprocs一个空数组时,会出现这些问题.而不是不进入循环,sproc只是返回一个错误,指出FOR LOOP的上限为NULL.不应该是0吗
我正在做FOR LOOP吗?
在使用空数组时没有返回NULL的情况下,是否有其他方法在LOOP中使用相同的边界?
注意:我知道我可以在LOOP之前总是使用一个条件,像这样:
IF array_length(array,1) IS NOT NULL THEN
但问题是:这个sproc应该在最短的时间内处理数千个呼叫.因此,我不是在为处理增加不必要的开销.我只是想看看有没有办法“循环”一个LOOP中的一个空数组.
和往常一样,如果要对NULL值有不同的行为,请使用coalesce结构:
原文链接:https://www.f2er.com/postgresql/192667.htmlFOR i IN 1..coalesce(array_length(array,1),0) LOOP RAISE NOTICE '%',array[i]; END LOOP;
对于返回值:array_length(x,N)返回第N维的元素数.由于空数组没有维,所以返回NULL.你是对的,如果你只考虑简单的数组,但对于多维数组来说是有意义的.
编辑:像Erwin Brandstetter在评论中写道,使用array_lower / upper来循环数组索引更为正确.这些将适用于不是基于1的数组.这些也采取维度论证并要求合并:
FOR i IN coalesce(array_lower(array,1)..coalesce(array_upper(array,1) LOOP RAISE NOTICE '%',array[i]; END LOOP;