如何在pl/pgsql中的foreach循环中获取当前键?

4

我遍历一个数组,并对数组值和键进行操作。自从PostgreSQL 9.1以来,有了foreach循环,因此数组值没有问题,但是否有一种优雅的方法来获取键?我找到的唯一解决方案是维护额外的变量:

CREATE OR REPLACE FUNCTION foobar( bar integer[] ) RETURNS integer AS $$
DECLARE
  foo integer;
  barkey integer;
BEGIN
  barkey := 1;
  FOREACH foo IN ARRAY bar LOOP
    -- do some stuff using foo and barkey
    barkey := barkey + 1;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

这是最好的解决方案吗?还是有更加优雅的方案可供选择?

3个回答

6

FOREACH 用于循环遍历数组值的元素,而不是它们的键。 FORgenerate_subscripts() 可以用于遍历键。

但通常情况下,数组的键和值之间不应该有任何关系。


+1并且接受两个原因:1)建议我应该遍历键而不是使用foreach,2)链接到generate_subscripts()。 - Pavel V.
最好链接到/current版本的手册,除非您想要引用特定版本。 - Erwin Brandstetter
@ErwinBrandstetter也许你是对的。我只是觉得,如果将来的某个Postgres版本出现了不兼容的变化,那么我的回答可能会失效(比如,在7和8之间发生了一些变化)。之前不知道Stack Overflow有这样的约定,谢谢你告诉我。 - pozs

4

对于想要使用下标在数组上进行循环的PL/pgSQL开发人员,您可以使用以下类型的代码。这只是pozs答案的一个工作示例(就我所理解的)。

DO $$
DECLARE
  vTab text[] := ARRAY['abc','def','ghi'];
  ind integer;
BEGIN
  FOR ind IN SELECT generate_subscripts(vTab,1)
  LOOP
    RAISE NOTICE 'element % = %', ind, vTab[ind];
  END LOOP;
END;
$$;

结果:

NOTICE:  element 1 = abc
NOTICE:  element 2 = def
NOTICE:  element 3 = ghi

1

对于某些特定的目的,原始SQL可能更加优雅,有时也更快:

postgres=# SELECT count(*) from unnest(ARRAY[1,2,3,4]);
+-------+
| count |
+-------+
|     4 |
+-------+
(1 row)

但通常FOREACH子句是最优的


对于一个一维索引:SELECT array_length(bar,1) - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接