【问题标题】:How to get current key in foreach in pl/pgsql?如何在 pl/pgsql 中获取 foreach 中的当前键?
【发布时间】:2014-07-02 05:47:30
【问题描述】:

我遍历一个数组,并对数组值和它的键做一些事情。由于PostgreSQL 9.1有foreach循环,所以数组值没有问题,但是有什么优雅的方法来获取key吗?我发现的唯一解决方案是为此维护额外的变量:

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;

这是最好的解决方案,还是有更优雅的方法?

【问题讨论】:

    标签: arrays postgresql loops foreach plpgsql


    【解决方案1】:

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

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

    【讨论】:

    • +1 并被接受有两个原因:1)建议我应该迭代密钥而不是使用 foreach 和 2)链接到 generate_subscripts()。
    • 最好链接到/current version of the manual,除非您想针对特定版本。
    • @ErwinBrandstetter 也许你是对的。我只是认为,如果将来的某些 postgres 版本中会有向后不兼容的更改,那将破坏我的答案(例如,介于 7 和 8 之间)。不知道那个元 SO 约定,谢谢。
    【解决方案2】:

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

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

    但通常 FOREACH 子句是最优的

    【讨论】:

    • 对于一维索引:SELECT array_length(bar,1).
    【解决方案3】:

    对于希望使用下标在数组上循环的 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
    

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2019-06-25
      • 2017-04-21
      • 2013-01-30
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多