Arrays postgres,null数组vs 0长度数组:它们都返回null=true,但行为不同

Arrays postgres,null数组vs 0长度数组:它们都返回null=true,但行为不同,arrays,postgresql,Arrays,Postgresql,在我测试的函数(plpgsql)和代码块中,pgsql确实不需要初始化数组。 试试这个:我只是在添加元素之前和之后测试数组长度 do $$ declare ai int[]; begin --BEFORE raise notice 'ai length: %', array_length(ai,1); --append the element (to the NON initialized array) ai = array_append(ai,'2016'); --AFTER rais

在我测试的函数(plpgsql)和代码块中,pgsql确实不需要初始化数组。
试试这个:我只是在添加元素之前和之后测试数组长度

do $$ 
declare ai int[];
begin

--BEFORE
raise notice 'ai length: %', array_length(ai,1);

--append the element (to the NON initialized array)
ai = array_append(ai,'2016');

--AFTER
raise notice 'ai length: %', array_length(ai,1);

end;
$$
没有错误,结果是:

NOTICE:  ai length: <NULL>
NOTICE:  ai length: 1
输出:

注意:ai长度:空
注意:元素99:NULL

因此,您开始认为数组在某种程度上是惰性初始化的,只需使用它们。 但情况并非总是如此,请考虑以下代码:

do $$  
  declare ai int[]; 
  declare i int; 

begin

foreach i in array ai loop
    raise notice 'Element: %', i;
end loop;

end; $$
这确实是一个错误!以下是:

错误:FOREACH表达式不能为null

因此,在某些情况下,必须初始化数组。 让我们检查一下,并找出初始化和未初始化之间的区别:

do $$
declare ai int[];
declare x int;
declare i int;
begin

raise notice 'Array length: %', array_length(ai,1);

ai = array[] :: int[];

raise notice 'Array length: %', array_length(ai,1);

foreach i in array ai loop
    raise notice 'Element: %', i;
end loop;

end;
$$
输出:

注意:数组长度:NULL
注意:数组长度:NULL

那么:线路呢

ai = array[] :: int[];
事实上,for循环不再抛出异常

但是初始化之后,

raise notice 'Array length: %', array_length(ai,1);
仍然给出'null',这是非常奇怪的

问题是:我初始化数组的方式正确吗?
这种奇怪的行为有什么解释吗


(Postgres版本:9.5)

在plpgsql函数中,我通常在
声明中初始化数组:

declare
    arr int[] = '{}';
一个未初始化的数组当然是空的

要区分空数组和空数组,可以使用
cardinality()
而不是
array\u length()


在plpgsql函数中,我通常在
声明中初始化数组:

declare
    arr int[] = '{}';
一个未初始化的数组当然是空的

要区分空数组和空数组,可以使用
cardinality()
而不是
array\u length()

with data(ar) as (
    values (array[1]), (array[]::int[]), (null)
)
select ar "array", ar isnull "isnull?", array_length(ar, 1), cardinality(ar)
from data;

 array | isnull? | array_length | cardinality 
-------+---------+--------------+-------------
 {1}   | f       |            1 |           1
 {}    | f       |              |           0
       | t       |              |            
(3 rows)