выберите regexp_replace ('aaa_bbb', '(_.)', верхний ('\ 1')) из двойного - PullRequest
2 голосов
/ 07 октября 2019

Используя Oracle 11g

select regexp_replace('aaa_bbb', '(_.)', upper('\1')) from dual;

Я хочу 'aaa_Bbb'.

Но он возвращает 'aaa_bbb'.

Почему нельзя заменить?

Ответы [ 4 ]

2 голосов
/ 07 октября 2019

Верхний выполнить ранее Regexp

select regexp_replace('aaa_bbb', '(_.)', upper(regexp_substr('aaa_bbb', '(_.)'))) from dual
1 голос
/ 07 октября 2019

Проблема с

select regexp_replace('aaa_bbb', '(_.)', upper('\1')) from dual;

заключается в том, что upper выполняется до regexp_replace, что фактически делает его:

select regexp_replace('aaa_bbb', '(_.)', '\1') from dual;

Так что вам нужен другой подход.

См. Ответ на регулярное выражение оракула заменяет заглавную строку замены

0 голосов
/ 07 октября 2019

Я не думаю, что есть прямой метод конвертации с использованием regexp_replace, но это возможно с помощью regexp_substr таким образом:

with t(str) as
(
 select 'aaa_bbb' from dual
)
select concat( regexp_substr(str, '.*[_^]'), initcap( regexp_substr(str, '[^_]+$') ) )
       as "Formatted String"
  from t;


Formatted String
----------------
aaa_Bbb

Демо

0 голосов
/ 07 октября 2019

Если не нужно использовать регулярные выражения , тогда substr + instr + initcap может помочь.

SQL> with test (col) as
  2    (select 'aaa_bbb' from dual)
  3  select substr(col, 1, instr(col, '_')) || initcap(substr(col, instr(col, '_') + 1)) result
  4  from test;

RESULT
-------
aaa_Bbb

SQL>
...