Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Номер выполняемой замены  [new]
pkuzmich
Member

Откуда:
Сообщений: 90
есть строка 'ХаХаХа'
надо получить 'Х1аХ2аХ3а'
т.е. после символа/последовательности символов нужно поставить сколько раз эта подстрока встретилась в исходной строке
с помощью regexp_replace или аналогов можно сделать?
7 май 09, 13:39    [7157620]     Ответить | Цитировать Сообщить модератору
 Re: Номер выполняемой замены  [new]
Lecter
Member

Откуда: Киев
Сообщений: 2032
pkuzmich,

А на PL/SQL накнопать? Простой цикл и SUBSTR рулят непосильно...
7 май 09, 14:01    [7157801]     Ответить | Цитировать Сообщить модератору
 Re: Номер выполняемой замены  [new]
pkuzmich
Member

Откуда:
Сообщений: 90
Lecter,
это никогда непоздно
интересует вариант без написания своей функции
7 май 09, 14:12    [7157879]     Ответить | Цитировать Сообщить модератору
 Re: Номер выполняемой замены  [new]
Proteus
Member

Откуда:
Сообщений: 1348
Что то мне кажется что это начало для пакета dbms_zip
7 май 09, 14:12    [7157881]     Ответить | Цитировать Сообщить модератору
 Re: Номер выполняемой замены  [new]
Proteus
Member

Откуда:
Сообщений: 1348
А если по существу то разложи строку в набор символов (substr + select ... connect by level < length) а затем пронумеруй и собери назад.
7 май 09, 14:15    [7157912]     Ответить | Цитировать Сообщить модератору
 Re: Номер выполняемой замены  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Из спортивного азарта вскормил жуткого монстра без регулярных выражений :-)
"Некрасивость" здесь для меня - отказ от начального подсчета количества
включений (аналога regexp_count - уж чересчур трудоемко будет)
и задания сразу максимального значения level по длине строки
с последующим отсевом "лишних" строк.

Потестировал...

SQL> 
SQL> with tab1 as
  2  (select 'XaaXaaXaa' col1 , 'a' templat from dual)
  3  select replace(max(sys_connect_by_path(stroka, ',')), ',') ||
  4         min(substr(col1, inst + 1)) keep(dense_rank first order by length(substr(col1, inst)))
  5    from (select q.*,
  6                 substr(col1, inst_lag + 1, inst - inst_lag) || lv stroka,
  7                 row_number() over(order by lv) rn
  8            from (select col1,
  9                         level lv,
 10                         decode(instr(col1, templat, 1, level),
 11                                0,
 12                                0,
 13                                instr(col1, templat, 1, level) + length(templat) - 1) inst,
 14                         lag(instr(col1, templat, 1, level) + length(templat) - 1,
 15                             1,
 16                             0) over(order by level) inst_lag
 17                    from tab1
 18                  connect by level <= length(col1)) q
 19           where substr(col1, inst_lag + 1, inst - inst_lag) is not null)
 20  connect by prior rn = rn - 1
 21   start with rn = 1
 22  /
 
REPLACE(MAX(SYS_CONNECT_BY_PAT
--------------------------------------------------------------------------------
Xa1a2Xa3a4Xa5a6
 
SQL> 
SQL> with tab1 as
  2  (select 'XaaXaaXaa' col1 , 'X' templat from dual)
  3  select replace(max(sys_connect_by_path(stroka, ',')), ',') ||
  4         min(substr(col1, inst + 1)) keep(dense_rank first order by length(substr(col1, inst)))
  5    from (select q.*,
  6                 substr(col1, inst_lag + 1, inst - inst_lag) || lv stroka,
  7                 row_number() over(order by lv) rn
  8            from (select col1,
  9                         level lv,
 10                         decode(instr(col1, templat, 1, level),
 11                                0,
 12                                0,
 13                                instr(col1, templat, 1, level) + length(templat) - 1) inst,
 14                         lag(instr(col1, templat, 1, level) + length(templat) - 1,
 15                             1,
 16                             0) over(order by level) inst_lag
 17                    from tab1
 18                  connect by level <= length(col1)) q
 19           where substr(col1, inst_lag + 1, inst - inst_lag) is not null)
 20  connect by prior rn = rn - 1
 21   start with rn = 1
 22  /
 
REPLACE(MAX(SYS_CONNECT_BY_PAT
--------------------------------------------------------------------------------
X1aaX2aaX3aa
 
SQL> 
SQL> with tab1 as
  2  (select 'XaaXaaXaa' col1 , 'Xaa' templat from dual)
  3  select replace(max(sys_connect_by_path(stroka, ',')), ',') ||
  4         min(substr(col1, inst + 1)) keep(dense_rank first order by length(substr(col1, inst)))
  5    from (select q.*,
  6                 substr(col1, inst_lag + 1, inst - inst_lag) || lv stroka,
  7                 row_number() over(order by lv) rn
  8            from (select col1,
  9                         level lv,
 10                         decode(instr(col1, templat, 1, level),
 11                                0,
 12                                0,
 13                                instr(col1, templat, 1, level) + length(templat) - 1) inst,
 14                         lag(instr(col1, templat, 1, level) + length(templat) - 1,
 15                             1,
 16                             0) over(order by level) inst_lag
 17                    from tab1
 18                  connect by level <= length(col1)) q
 19           where substr(col1, inst_lag + 1, inst - inst_lag) is not null)
 20  connect by prior rn = rn - 1
 21   start with rn = 1
 22  /
 
REPLACE(MAX(SYS_CONNECT_BY_PAT
--------------------------------------------------------------------------------
Xaa1Xaa2Xaa3
 
SQL> 
SQL> with tab1 as
  2  (select 'XaaXaaXaa' col1 , 'DXaa' templat from dual)
  3  select replace(max(sys_connect_by_path(stroka, ',')), ',') ||
  4         min(substr(col1, inst + 1)) keep(dense_rank first order by length(substr(col1, inst)))
  5    from (select q.*,
  6                 substr(col1, inst_lag + 1, inst - inst_lag) || lv stroka,
  7                 row_number() over(order by lv) rn
  8            from (select col1,
  9                         level lv,
 10                         decode(instr(col1, templat, 1, level),
 11                                0,
 12                                0,
 13                                instr(col1, templat, 1, level) + length(templat) - 1) inst,
 14                         lag(instr(col1, templat, 1, level) + length(templat) - 1,
 15                             1,
 16                             0) over(order by level) inst_lag
 17                    from tab1
 18                  connect by level <= length(col1)) q
 19           where substr(col1, inst_lag + 1, inst - inst_lag) is not null)
 20  connect by prior rn = rn - 1
 21   start with rn = 1
 22  /
 
REPLACE(MAX(SYS_CONNECT_BY_PAT
--------------------------------------------------------------------------------
 
SQL> 
7 май 09, 14:46    [7158176]     Ответить | Цитировать Сообщить модератору
 Re: Номер выполняемой замены  [new]
XaaXaaXaa
Guest
Уж как получилось :)
WITH t AS (SELECT 'XaaXaaXaa' a, 'Xaa' b 
             FROM dual)
SELECT a FROM t
  MODEL 
        DIMENSION BY (0 r)
        MEASURES (CAST(a AS VARCHAR2(4000)) a, b, length(a) l)
        RULES ITERATE(1e6) UNTIL l[0] <= iteration_number
        (a[0] = regexp_replace(a[0],b[0],b[0]||ltrim((l[0]-iteration_number),0),1,l[0]-iteration_number))
7 май 09, 15:51    [7158654]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить