我遇到了两个用于会计的表的问题 第一个名为tabela1的表具有一组符号和帐户。第二个表是符号,第一个表中要更改的名称和第一个表的记录号。
Tabela1是:
ID |KNT_S_WN | KNT_S_MA |
1 |3021-_R | 3021-_K-_W|
2 |_W-_R | _Z |
Tabelas是:
ID | SYMBOL |REP |
1 | _R |7Z45 |
1 | _K |321-05 |
1 | _W |490 |
2 | _W |C1 |
2 | _R |C17 |
2 | _Z |320 |
我需要这个输出:
ID |KNT_S_WN | KNT_S_MA |
1 |3021-7Z45 | 3021-321-05-490|
2 |C1-C17 | 320 |
我试试这个:
update tabela set
knt_s_wn=replace(knt_s_wn,
(select symbol from tabelas where tabela.id=tabelas.id and position(tabelas.symbol in knt_s_wn)>0),
(select a from tabelas where tabela.id=tabelas.id and position(tabelas.symbol in knt_s_wn)>0))
如果我使用这个表达式,如果它不是knt_s_wn符号被删除(空白)。 请帮帮我!!!
答案 0 :(得分:0)
最简单的解决方案之一是在plpgsql函数中替换循环中的字符串:
create or replace function multireplace(aid int, str text)
returns text language plpgsql as $$
declare
rec record;
begin
for rec in
select *
from tabelas
where id = aid
loop
str:= replace(str, rec.symbol, rec.rep);
end loop;
return str;
end $$;
答案 1 :(得分:0)
纯sql解决方案(即:没有程序sql)得到:
我需要这个输出:
ID |KNT_S_WN | KNT_S_MA | 1 |3021-7Z45 | 3021-321-05-490| 2 |C1-C17 | 320 |
如下:
with recursive t(id, knt_s_wn, knt_s_ma, symbols, reps) as (
select
tabela.id,
knt_s_wn,
knt_s_ma,
array_agg(symbol),
array_agg(rep)
from tabela
join tabelas on tabelas.id = tabela.id
group by 1, 2, 3
union all
select
id,
replace(knt_s_wn, symbols[1], reps[1]),
replace(knt_s_ma, symbols[1], reps[1]),
array_remove(symbols, symbols[1]),
array_remove(reps, reps[1])
from t
where array_length(symbols, 1) > 0
)
select id, knt_s_wn, knt_s_ma
from t
where symbols = array[]::text[];