在字符串中查找源na替换参数,并在另一个字符串中执行替换

时间:2018-11-15 06:36:05

标签: oracle function replace plsql regexp-replace

我需要一个应用特定规则的函数来替换字符串中的单词。

有两个变量:

  • v_imp_user_list-用管道分隔的用户列表(例如:JOHN | PETER | MARK | USER_PROD)
  • v_schema_remap_list-应该重新映射的用户列表(旧值-新值,例如:JOHN-GEORGE,USER_PROD-USER_TEST)

该函数应解析v_schema_remap_list变量以及第一个用户的名称(破折号,旧值之前) 存在于v_imp_user_list中,然后将其替换为第二个用户(破折号后为新值)。

示例:

v_imp_user_list:='乔恩 | PETER | MARK | USER_PROD '

v_schema_remap_list:=' JOHN-GEORGE USER_PROD-USER_TEST

所需结果: GEORGE | PETER | MARK | USER_TEST

我有一个解决方案,我会发布,但是由于某种原因,我不喜欢它,并且会感谢您提出任何评论/评论/更好的解决方案。

1 个答案:

答案 0 :(得分:0)

此功能可帮助我解析v_schema_remap_list。

  --    extract nth occurence in a delimited string
        create or replace function f_find_str (
            source_string varchar2
            , occurence_outer number --occurence of the old-new pair
            , occurence_inner number --old/new value, enter 1 for old or 2 for new
            )
        return varchar2
        is
            v_aux varchar2(500);
            v_result varchar2(100);
        begin
            v_aux := ltrim(regexp_substr(',' || source_string, ',[^,]*', 1, occurence_outer),',');
            if occurence_inner = 1 then
                v_result := substr(v_aux, 1, instr(v_aux, '-')-1);
            elsif occurence_inner = 2 then
                v_result := substr(v_aux, instr(v_aux, '-')+1);
            end if;
            return v_result;
        end;
        /

此匿名块显示了我的解决方案(请参阅内部的循环)。

    declare
     v_schema_remap_list varchar2(1000) := 'JOHN-GEORGE,USER_PROD-USER_TEST';
     v_imp_user_list varchar2(1000) := 'JOHN|PETER|MARK|USER_PROD';
     v_schema_remap_cnt number := nvl(regexp_count(v_schema_remap_list, '-'), 0); 
    begin

        for i in 1..v_schema_remap_cnt
        loop
            v_imp_user_list := replace(
                v_imp_user_list||'|', 
                f_find_str (
                source_string => v_schema_remap_list
                , occurence_outer => i
                , occurence_inner => 1
                )||'|', 
                f_find_str (
                source_string => v_schema_remap_list
                , occurence_outer => i
                , occurence_inner => 2
                )||'|'
            );
            v_imp_user_list := rtrim(v_imp_user_list, '|');
        end loop;
        dbms_output.put_line(v_imp_user_list); --test output
    end;
    /