Есть ли какой-либо способ добавить уникальный идентификатор к каждой замене, которую выполняет REGEXP_REPLACE?

#sql #oracle #replace #sql-update #regexp-substr

#sql #Oracle #заменить #sql-обновление #регулярное выражение-substr

Вопрос:

У меня есть большой текстовый блок, который требует некоторого преобразования.

Многим строкам в моем CLOB предшествует имя переменной в скобках, например:

 [VARIABLE_NAME_ONE] variable_one = 1   variable_two;

[VARIABLE_NAME_TWO] variable_two = 2   variable_three;

[VARIABLE_NAME_ONE] variable_one = variable_four - 4;
 

Проблема в том, что некоторые имена переменных в скобках не уникальны, но они должны быть уникальными после завершения преобразования.

Я хотел бы расширить все имена переменных в скобках чем-то вроде счетчика, чтобы обеспечить уникальность. Из-за скобок моей первоначальной мыслью было простое regexp_replace, но есть ли какой-нибудь способ включить в это счетчик?

Чтобы завершить мое объяснение, я хотел бы, чтобы предыдущие строки примера были преобразованы в это:

 [VARIABLE_NAME_ONE_1] variable_one = 1   variable_two;

[VARIABLE_NAME_TWO_2] variable_two = 2   variable_three;

[VARIABLE_NAME_ONE_3] variable_one = variable_four - 4;
 

Ответ №1:

Вы можете использовать иерархический запрос путем разделения на точки с запятой REGEXP_SUBSTR при замене значений непосредственно перед квадратными скобками. А затем объединить фрагменты по LISTAGG() функции

 UPDATE tab 
   SET col = (
              WITH t AS
              (
                 SELECT REPLACE(REGEXP_SUBSTR(col,'[^;] ',1,level),']','_'||level||']') 
                     AS col, level AS lvl
                  FROM TAB t
                CONNECT BY level <= REGEXP_COUNT(col,';')
              )
              SELECT LISTAGG(col,';') WITHIN GROUP (ORDER BY lvl)||';'
                FROM t) 
 

Demo