SQL在表中查找和替换

时间:2015-06-16 01:35:33

标签: sql postgresql

我正在尝试在表格中的所有列上运行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特定的解决方案。

1 个答案:

答案 0 :(得分:1)

该函数构建一个查询,在表pattern的所有文本列中使用replacementflags替换为table_name。 该函数返回查询的文本。如果runtrue,则函数会执行查询。

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);