如何在 PostgreSQL 循环中使用 FOREACH

How to use FOREACH in a PostgreSQL LOOP

我正在尝试编写一个非常简单的 pgsql 语句来遍历一个简单的状态缩写数组。

 CREATE OR REPLACE FUNCTION my_schema.showState() 
 RETURNS text AS 
 $$
 DECLARE
 my_array text[] := '["az","al", "ak", "ar"]' 
 BEGIN
     FOREACH state IN my_array 
     LOOP
         RETURN SELECT format('%s', state);
     END LOOP;
 END;
 $$ LANGUAGE plpgsql;

SELECT * FROM showState();

我使用的是 PostgresSQL 版本 11+。我一直收到错误 ERROR: syntax error at or near "BEGIN" 我想在此处看到的输出现在只是看到结果 window 中打印的州缩写。像这样:

我做错了什么?

  • my_array text[] := '["az","al", "ak", "ar"]' 之后少了一个 ;
  • '["az","al", "ak", "ar"]' 不是有效的数组文字。
  • 如果您想要一个集合 returning 函数,您需要将其 return 类型声明为 SETOF
  • FOREACH 的头部缺少 ARRAY 关键字。
  • state必须声明。
  • 您需要使用 RETURN NEXT ... 将值推入要 returned 的集合。
  • format() 在这里毫无意义,它没有有效地做任何事情。

通过所有这些纠正,一个人会得到一些类似的东西:

CREATE
 OR REPLACE FUNCTION showstate()
                     RETURNS SETOF text
AS 
$$
DECLARE
  my_array text[] := ARRAY['az',
                           'al',
                           'ak',
                           'ar'];
  state text;
BEGIN
  FOREACH state IN ARRAY my_array 
  LOOP
    RETURN NEXT state;
  END LOOP;
END;
$$
LANGUAGE plpgsql;

db<>fiddle