Arrays postgres,null数组vs 0长度数组:它们都返回null=true,但行为不同
在我测试的函数(plpgsql)和代码块中,pgsql确实不需要初始化数组。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
试试这个:我只是在添加元素之前和之后测试数组长度
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)