【问题标题】:Find source na replacement parameters in a string and perform replacement in another string在一个字符串中查找源 na 替换参数并在另一个字符串中执行替换
【发布时间】:2019-04-18 05:13:10
【问题描述】:

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

有两个变量:

  • 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 := 'JOHN|PETER|MARK|USER_PROD'

v_schema_remap_list := 'JOHN-GEORGE,USER_PROD-USER_TEST'

期望的结果: 乔治|彼得|马克|USER_TEST

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

【问题讨论】:

    标签: oracle function replace plsql regexp-replace


    【解决方案1】:

    这个函数帮助我解析 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;
        /
    

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2017-06-16
      • 2022-08-17
      • 2013-12-03
      • 2018-01-14
      • 2019-05-14
      • 2018-08-29
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多