JMa*_*aes 21 arrays postgresql plpgsql
我正在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;
Run Code Online (Sandbox Code Playgroud)
当我向sprocs提供一个空数组时会出现问题.sproc只是返回一个错误,而不是不进入循环,说明FOR LOOP的上限是NULL.不应该是0吗?
我对FOR LOOP有什么不妥吗?
有没有其他方法在LOOP中使用相同的边界而不使用空数组时返回NULL?
注意:我知道我总是可以在LOOP之前使用条件,如下所示:
IF array_length(array,1) IS NOT NULL THEN
Run Code Online (Sandbox Code Playgroud)
但问题是:这个sproc应该在最短的时间内处理数千个电话.因此,我并不期待为处理增加不必要的开销.我只是在寻找是否有办法在循环中"循环"一个空数组.
int*_*tgr 16
与往常一样,如果要对NULL值使用不同的行为,请使用coalesce
构造:
FOR i IN 1..coalesce(array_length(array, 1), 0) LOOP
RAISE NOTICE '%', array[i];
END LOOP;
Run Code Online (Sandbox Code Playgroud)
至于返回值:array_length(x, N)
返回第N维中的元素数.由于空数组没有维度,因此返回NULL.你是对的,如果你只考虑简单的数组,它是违反直觉的,但对于多维数组是有意义的.
编辑:像Erwin Brandstetter在评论中写道,使用array_lower/upper循环数组索引更为正确.这些将适用于非基于1的阵列.这些也需要维度参数并要求合并:
FOR i IN coalesce(array_lower(array, 1), 1)..coalesce(array_upper(array, 1), 1) LOOP
RAISE NOTICE '%', array[i];
END LOOP;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13664 次 |
最近记录: |