2015-06-16 135 views
0

我試圖在我的表中的所有列上運行reg_exp_replace。對於一排,下面是它看起來像 -SQL查找和替換表

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

這個函數建立一個查詢使用表table_name的所有文字列flagsreplacement更換pattern。 該函數返回查詢的文本。如果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);