postgresql plpgsql:无法迭代varchar[]类型的数组

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

我试图使用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 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。循环
。我已经更新了我的答案来解决这个问题。