postgresql plpgsql:无法迭代varchar[]类型的数组
我试图使用plpgsql检查数组中是否存在元素 我在执行函数时收到“数组下标必须有整数”错误 选择测试('IND')应返回true,选择测试('ING')应返回false 下面是代码postgresql plpgsql:无法迭代varchar[]类型的数组,postgresql,plpgsql,Postgresql,Plpgsql,我试图使用plpgsql检查数组中是否存在元素 我在执行函数时收到“数组下标必须有整数”错误 选择测试('IND')应返回true,选择测试('ING')应返回false 下面是代码 create or replace function test(country varchar) returns varchar language plpgsql AS $function$ declare results varchar; countryarr varchar[3]; i va
create or replace function test(country varchar)
returns varchar
language plpgsql
AS $function$
declare
results varchar;
countryarr varchar[3];
i varchar[];
begin
countryarr := array['IND','USA','MEX'];
foreach i slice 1 in array countryarr
loop
if countryarr[i]=country
then results := 'TRUE';
else
results := 'FALSE';
end if;
end loop;
return results;
end;
$function$
;
您的
i
在代码中定义为varchar[]
。它不能用作整数
你想要这样的东西:
create or replace function test(country varchar)
returns varchar
language plpgsql
AS $function$
declare
countryarr varchar[3];
i text;
begin
countryarr := array['IND','USA','MEX'];
foreach i in array countryarr
loop
if i = country
then return 'TRUE';
end if;
end loop;
return 'FALSE';
end;
$function$
;
对于您想要实现的目标,更好的解决方案是:
create or replace function test(country varchar)
returns varchar
language sql
AS $function$
select case
when country = any(array['IND', 'USA', 'MEX']) then 'TRUE'
else 'FALSE'
end;
$function$;
让函数返回布尔值。然后,它简化为一条SQL语句
create or replace function is_valid_country(country_in varchar)
returns boolean
language sql
immutable strict
AS $$
select country_in = any(array['IND', 'USA', 'MEX']) ;
$$;
with test(country) as
( values ('IND'), ('USA'), ('MEX'), ('CAN'),('UK') )
select country, is_valid_country(country) is_valid
from test;
这可以在任何后续sql语句中使用。优化器可以在线运行它。简单的
返回SELECT country=ANY(countryarr)
而不是循环不起作用?更好的是:您可能不需要函数来执行此测试。谢谢Mike,但是当我尝试执行更新的代码时,我总是为'MEX'设置为true,为'IND'和'USA'设置为false,尽管它仍然存在于数组中…@Nasir抱歉。我没有看到逻辑错误,因为我专注于foreach。循环
。我已经更新了我的答案来解决这个问题。