2016-06-14 6 views
0

Просто быстрая проверка, можно ли заменить все вхождения одним оператором select. Если нет, мы планируем написать функцию для замены.Oracle: Замена нескольких вхождений строк

Пример строки

select '#col1:[email protected], #col2:[email protected], #col3:[email protected], #col4:[email protected], #col5:[email protected]' str from dual 

Ожидаемый результат

str 
--- 
col1 val1, col2 val2, col3 val3, col4 val4, col5 val5 

код до сих пор

with test_table as 
(Select '#col1:[email protected], #col2:[email protected], #col3:[email protected], #col4:[email protected], #col5:[email protected]' str from dual) 

    select level "occurrence", REGEXP_substr(str, '#(.*?):', 1, level, 'in', 1) "column", REGEXP_substr(str, ':(.*?)@', 1, level, 'in', 1) "value" 
    from test_table 
    CONNECT BY REGEXP_COUNT(str, '#.+?:[email protected]') >= level 

Дополнительная информация

  1. String шаблон фиксирован и известен заранее.
  2. Возникновение данного шаблона является динамическим, может иметь любое количество пар [столбец: значение] - они на самом деле [таблица column: alias] установлены.
  3. Я упростил образец строки для простоты, однако он содержит дополнительные сведения (таблицы соединений, где предложение и т. Д.), Поэтому нам нужно будет заменить все вхождения. Это фактически выбор.

ответ

0

Моя попытка:

with test_table as 
(Select '#col1:[email protected], #col2:[email protected], #col3:[email protected],  #col4:[email protected], #col5:[email protected]' str 
from dual) 

select regexp_replace(regexp_replace(str, '[#@]', ''), '[ :]+', ' ') rez 
from test_table 
; 

Внутренний REGEXP_REPLACE заменяет # и @ ничего (пустая строка), а внешнее регулярное выражение заменяет: и пробелы одним пробелом.

Смежные вопросы