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

时间:2014-05-14 09:03:56

标签: arrays postgresql loops foreach plpgsql

我迭代一个数组,并对数组值及其键执行某些操作。由于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 个答案:

答案 0 :(得分:4)

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

但一般来说,数组的键和值之间应该没有关系。

答案 1 :(得分:1)

对于希望使用下标对数组进行LOOP的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

答案 2 :(得分:0)

出于某些特定目的,原始SQL可以更优雅,有时更快:

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

但通常FOREACH条款是最佳的