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
中的行顺序