Sql oracle 12c-在字符最后一次出现后选择字符串
我有以下资料:Sql oracle 12c-在字符最后一次出现后选择字符串,sql,string,oracle,oracle12c,Sql,String,Oracle,Oracle12c,我有以下资料: ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence 所以我想选择句子,因为它是最后一个句点之后的字符串。我怎样才能做到这一点呢?您可能可以用复杂的正则表达式来做到这一点。我喜欢以下方法: select substr(str, - instr(reverse(str), '.') + 1) 当字符串结束时,没有什么比测试更能看出这一点不起作用了。关于-0=0的东西。这里有一个改进: select (case when str
ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence
所以我想选择
句子
,因为它是最后一个句点之后的字符串。我怎样才能做到这一点呢?您可能可以用复杂的正则表达式来做到这一点。我喜欢以下方法:
select substr(str, - instr(reverse(str), '.') + 1)
当字符串结束时,没有什么比测试更能看出这一点不起作用了。关于-0=0的东西。这里有一个改进:
select (case when str like '%.' then ''
else substr(str, - instr(reverse(str), ';') + 1)
end)
编辑:
您的示例在本地Oracle和中运行时都有效
我正在运行以下代码:
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
一条线有多少个点
select length(str) - length(replace(str, '.', '') number_of_dots from ...
在最后一个点后获取子字符串:
select substr(str, instr(str, '.', 1, number_of_dots)+1) from ...
还有另一种方式
不确定从性能的角度看哪一个最好
这里的不同之处在于,我们使用-1向后计数以找到最后一个。在做这个练习的时候
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;
为了完整起见,这里有一个使用正则表达式的解决方案(不太复杂,IMHO:-): 正则表达式
- 使用求反字符类匹配除点以外的任何内容
[^.]
- 添加一个量词
,以匹配其中一个或多个+
- 使用锚点
将匹配限制到字符串末尾$
我觉得这个很有用。更加了解regexp_substr的第四个参数,
ocurrence
。回答得好@Alfabravo你用它得到倒数第二个元素了吗?我更喜欢这个解决方案,因为它更干净、更简单。你可以通过添加注释来改进你的答案
select regexp_substr(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
'[^.]+$')
from dual
select
substr(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
INSTR(
'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence',
'.',
-1
)+1
)
from dual;
select substr(str, instr(str, '.', -1) + 1)
from (
select 'ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence'
as str
from dual);
Sentence