select regexp_replace('aaa_bbb', '(_.)', upper('\1')) 来自 dual

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

使用 Oracle 11g

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

我要'aaa_Bbb'.

但是,它 returns 'aaa_bbb'.

为什么不能替换?

的问题
select regexp_replace('aaa_bbb', '(_.)', upper('')) from dual;

upper先于regexp_replace执行,有效使得:

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

所以你需要一个不同的方法。

查看 oracle regexp replace uppercase replacement string

的答案

如果不必使用 正则表达式 方法,那么 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>

上层更早执行正则表达式

select regexp_replace('aaa_bbb', '(_.)', upper(regexp_substr('aaa_bbb', '(_.)'))) from dual

我认为没有直接的方法可以使用 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

Demo