Найти исходные параметры замены в строке и выполнить замену в другой строке - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужна функция, которая применяет определенное правило для замены слов в строке.

Существуют две переменные:

  • v_imp_user_list - список пользователей, разделенных конвейером (пример:JOHN | PETER | MARK | USER_PROD)
  • v_schema_remap_list - список пользователей, которые должны быть переназначены (старое значение - новое значение, пример: JOHN-GEORGE, USER_PROD-USER_TEST)

Theфункция должна проанализировать переменную 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 '

Желаемый результат: GEORGE | PETER | MARK | USER_TEST

У меня есть решение, которое я опубликую, но дляпо какой-то причине мне это не нравится, и я буду благодарен за любой комментарий / обзор / лучшее решение.

1 Ответ

0 голосов
/ 15 ноября 2018

Эта функция помогает мне разобрать список 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;
    /
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...