我迭代一个数组,并对数组值及其键执行某些操作。由于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;
这是最好的解决方案,还是有更优雅的东西?
答案 0 :(得分:4)
FOREACH
用于循环遍历数组值的元素,而不是通过其键。可以使用FOR
或generate_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条款是最佳的