遍历 PL/pgSQL 中给定的值列表
Looping through a given list of values in PL/pgSQL
我正在尝试遍历几个字段并运行它们的函数:
FOR field IN ARRAY['f1','f2'] LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;
这是我正在尝试使用的功能:
CREATE OR REPLACE FUNCTION pg_temp.converFieldToLower(t varchar, f varchar) RETURNS void AS $$
#variable_conflict use_variable
BEGIN
EXECUTE concat_ws (' ', 'UPDATE',t,'SET',f,'= LOWER(',f,')');
END;
$$ LANGUAGE plpgsql;
看来声明数组的方式不对,我做错了什么?
ERROR: syntax error at or near "ARRAY"
LINE 49: FOR field IN ARRAY['f1','f2'] LOOP
你想要unnest
数组。
FOR field IN unnest(ARRAY['f1','f2']) LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;
FOREACH
loop是专门为遍历数组值的元素而设计的,例如:
FOREACH field IN ARRAY ARRAY['f1','f2'] LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field) into res;
END LOOP;
该功能是在 Postgres 9.1 中引入的。
EXECUTE
用于动态 SQL,这里没有任何动态。
您可能打算使用 PERFORM
丢弃结果。
循环有FOREACH
,如。更多详情:
- Loop over array dimension in plpgsql
或者只使用普通的 SQL,通常更简单、更快:
PERFORM pg_temp.converFieldToLower(newTableNameRaw, t.val)
FROM (VALUES ('f1'), ('f2')) t(val); -- for some given constants or variables
最佳解决方案取决于具体情况。 FOREACH
可能是处理实际数组的好主意。
对于只有两个或三个常量或变量,我会拼写出来并避免任何开销。更简单,更快。
PERFORM pg_temp.converFieldToLower(newTableNameRaw, 'f1');
PERFORM pg_temp.converFieldToLower(newTableNameRaw, 'f2');
我正在尝试遍历几个字段并运行它们的函数:
FOR field IN ARRAY['f1','f2'] LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;
这是我正在尝试使用的功能:
CREATE OR REPLACE FUNCTION pg_temp.converFieldToLower(t varchar, f varchar) RETURNS void AS $$
#variable_conflict use_variable
BEGIN
EXECUTE concat_ws (' ', 'UPDATE',t,'SET',f,'= LOWER(',f,')');
END;
$$ LANGUAGE plpgsql;
看来声明数组的方式不对,我做错了什么?
ERROR: syntax error at or near "ARRAY" LINE 49: FOR field IN ARRAY['f1','f2'] LOOP
你想要unnest
数组。
FOR field IN unnest(ARRAY['f1','f2']) LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;
FOREACH
loop是专门为遍历数组值的元素而设计的,例如:
FOREACH field IN ARRAY ARRAY['f1','f2'] LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field) into res;
END LOOP;
该功能是在 Postgres 9.1 中引入的。
EXECUTE
用于动态 SQL,这里没有任何动态。
您可能打算使用 PERFORM
丢弃结果。
循环有FOREACH
,如
- Loop over array dimension in plpgsql
或者只使用普通的 SQL,通常更简单、更快:
PERFORM pg_temp.converFieldToLower(newTableNameRaw, t.val)
FROM (VALUES ('f1'), ('f2')) t(val); -- for some given constants or variables
最佳解决方案取决于具体情况。 FOREACH
可能是处理实际数组的好主意。
对于只有两个或三个常量或变量,我会拼写出来并避免任何开销。更简单,更快。
PERFORM pg_temp.converFieldToLower(newTableNameRaw, 'f1');
PERFORM pg_temp.converFieldToLower(newTableNameRaw, 'f2');