oracle 12c - 在最后一次出现字符后选择字符串

时间:2014-06-06 14:46:02

标签: sql string oracle oracle12c

我有以下字符串:

ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence

所以我想选择Sentence因为它是最后一个句点之后的字符串。我怎么能这样做?

6 个答案:

答案 0 :(得分:14)

您可以使用复杂的正则表达式执行此操作。我喜欢以下方法:

select substr(str, - instr(reverse(str), '.') + 1)

没有什么比测试更能看到字符串结束时这不起作用。关于 - 0 = 0的事情。这是一个改进:

select (case when str like '%.' then ''
             else substr(str, - instr(reverse(str), ';') + 1)
        end)

编辑:

您的示例在我在本地Oracle和SQL Fiddle上运行时都有效。

我正在运行此代码:

select (case when str like '%.' then ''
             else substr(str, - instr(reverse(str), '.') + 1)
        end)
from (select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence' as str from dual) t

答案 1 :(得分:11)

为了完整起见,这里是使用正则表达式的解决方案(不是很复杂的恕我直言:-)):

select regexp_substr(
  'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
  '[^.]+$') 
from dual

正则表达式

  • 使用否定字符类来匹配除点[^.]
  • 之外的任何内容
  • 添加量词+以匹配其中一个或多个
  • 使用锚点$来限制与字符串结尾的匹配

答案 2 :(得分:1)

还有另一种方式。

从性能角度来看,最不合适......

这里的区别在于我们使用-1向后计数以找到最后一个。在做instr时。

  With CTE as 
  (Select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence' str, length('ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence') len from dual)
  Select substr(str,instr(str,'.',-1)+1,len-instr(str,'.',-1)+1) from cte;

答案 3 :(得分:0)

select 
  substr(
    'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',  
    INSTR(
      'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
      '.',
      -1
    )+1
  ) 
from dual;

答案 4 :(得分:0)

INSTR 函数接受第三个参数,即出现次数。它默认为 1(第一次出现),但也接受负数(意味着从最后一次出现向后计数)。

select substr(str, instr(str, '.', -1) + 1)
from (
    select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence'
           as str
    from dual);

Sentence

答案 5 :(得分:-1)

字符串中有多少个点?

select length(str) - length(replace(str, '.', '') number_of_dots from ...

在最后一个点后得到子串:

select substr(str, instr(str, '.', 1, number_of_dots)+1) from ...