Sql Postgres regexp使用另一个表替换regexp和替换值

Sql Postgres regexp使用另一个表替换regexp和替换值,sql,postgresql,Sql,Postgresql,假设我有一个包含键/值的表,其中键是正则表达式,对应的值是替换值。例如: table_a: Key Value ----------- a 123 b 456 c 789 我需要使用SQL更新另一个表中的值,方法是用对应的值替换上表中出现的每个键 如果我有一个单一的重置价值,我会使用这样的东西: UPDATE table_b SET some_field = REGEXP_REPLACE((SELECT STRING_AGG(table_a.key, '|

假设我有一个包含键/值的表,其中键是正则表达式,对应的值是替换值。例如:

table_a:

Key   Value
-----------
a     123
b     456
c     789
我需要使用SQL更新另一个表中的值,方法是用对应的值替换上表中出现的每个键

如果我有一个单一的重置价值,我会使用这样的东西:

UPDATE table_b 
SET    some_field = REGEXP_REPLACE((SELECT STRING_AGG(table_a.key, '|') 
                                    FROM   table_a), 'replacement value'); 
这将基于表a中的所有
构造一个正则表达式,并用我的替换字符串替换任何匹配项

我如何做类似的事情,但使用表a中相应的
作为替换值


使用Postgres 9.5

您无法在一次执行
regexp\u replace()
中实现这一点。对于
表a
的所有行,都需要一个循环和多次调用
regexp\u replace()
。因此,您需要一个plpgsql函数:

create or replace function replace_all_patterns(str text)
returns text language plpgsql as $$
declare
    r record;
begin
    for r in
        select key, value
        from table_a
    loop
        str:= regexp_replace(str, r.key, r.value, 'g');
    end loop;
    return str;
end $$;
假设
表b
包含两行:

create table table_b(some_field text);
insert into table_b values
('abc'),
('ccc');
您可以通过以下方式使用该功能:

update table_b
set some_field = replace_all_patterns(some_field)
returning *;

 some_field 
------------
 123456789
 789789789
(2 rows)
值得补充的是,该函数相当昂贵,在某些情况下,结果可能取决于
表a
中的行顺序