Postgresql从另一个表中替换表中的字符串

时间:2017-01-17 17:34:58

标签: postgresql

我遇到了两个用于会计的表的问题 第一个名为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符号被删除(空白)。 请帮帮我!!!

2 个答案:

答案 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 $$;

Test it here.

答案 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[];