如何使用像Initcap一样的字符串,但除了字母后跟点?

时间:2015-08-14 10:42:26

标签: sql oracle

假设我有一个字符串ABC&EFG d.d.,并在调用initcap之后

select initcap("ABC&EFG d.d.") from dual;

我会得到Abc&Efg D.D.这对于第一部分是完美的,但不是我需要的字母d.d.成为D.D.的部分。 所以我需要一个不会大写字母后跟点的initcap版本。 谁知道是否有这样的可能性?

只是澄清,因为我正在寻找潜在的内置功能。<​​/ p>

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式过滤字符串仅用于文本,然后跳过&#39; d.d。&#39;因为它不匹配正则表达式并在匹配的字符串上运行initcap。然后找到&#39; d.d。&#39;并在initcap之后将其连接到字符串。

     select initcap(REGEXP_SUBSTR('ABC'||chr(38)||'EFG d.d.','(\w\&?\w)+') ) 
|| REGEXP_SUBSTR('ABC'||chr(38)||'EFG d.d.','(\s(\w\.)+)+')  from dual;

请注意REGEXP_SUBSTR返回单个匹配项,因此这可能不适用于更复杂的字符串(即多个匹配项)。

答案 1 :(得分:2)

select 
   regexp_replace(
      initcap(
         regexp_replace('ABC&EFG d.d.', '(\w+\.)', chr(1)||'a\1')
      ), 
   chr(1)||'.') 
from dual;

答案 2 :(得分:1)

我会考虑用一长串随机字符(例如“sejvbwovbworuvybqerouyoqvuyrfwhrverhbeqorybquoyquobf”)替换所有.s,运行initcap,然后再用.s替换你的随机字符串。

Replace(
  InitCap(
    Replace('ABC&EFG d.d.', '.', 'sejvbwovbworuvybqero')),
  'sejvbwovbworuvybqero','.')

未测试!

心灵可能有更优雅的方法。