我正在尝试在表格中的所有列上运行reg_exp_replace
。对于一行,这是它的样子 -
UPDATE table
SET field = regexp_replace(field, 'foo', 'bar', 'g' )
除了明显地列出每一列的明显方法之外,是否有办法对所有列执行相同的操作?即。
UPDATE table
SET field1 = regexp_replace(field1, 'foo', 'bar', 'g' )
SET field2 = regexp_replace(field2, 'foo', 'bar', 'g' )
SET field3 = regexp_replace(field3, 'foo', 'bar', 'g' )
我正在使用Postgres,因此欢迎Postgres特定的解决方案。
答案 0 :(得分:1)
该函数构建一个查询,在表pattern
的所有文本列中使用replacement
将flags
替换为table_name
。
该函数返回查询的文本。如果run
为true
,则函数会执行查询。
create or replace function regexp_replace_in_table
(table_name text, pattern text, replacement text, flags text, run boolean)
returns text language plpgsql
as $$
declare
r record;
q text;
begin
q = format('update %s set ', table_name);
for r in
select attname
from pg_attribute
where attrelid = table_name::regclass
and attnum > 0
and not attisdropped
and atttypid = 25 -- column is of text type
order by attnum
loop
q = format($fmt$%s %s = regexp_replace(%s, '%s', '%s', '%s'),$fmt$,
q, r.attname, r.attname, pattern, replacement, flags);
end loop;
q = format('%s;', rtrim(q, ','));
if run then
execute q;
end if;
return q;
end $$;
select regexp_replace_in_table('my_table', 'foo', 'bar', 'g', false);