Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle 12c-在字符最后一次出现后选择字符串_Sql_String_Oracle_Oracle12c - Fatal编程技术网

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:-):

正则表达式

  • 使用求反字符类匹配除点以外的任何内容
    [^.]
  • 添加一个量词
    +
    ,以匹配其中一个或多个
  • 使用锚点
    $
    将匹配限制到字符串末尾

函数接受第三个参数,即事件。它默认为1(第一次出现),但也接受负数(意味着从最后一次出现开始倒数)


我觉得这个很有用。更加了解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