#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)