oracle 12c-выбор строки после последнего вхождения символа

у меня ниже строку:

ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence

поэтому я хочу выбрать Sentence так как это строка после последнего периода. Как я могу это сделать?

4 ответов


вы, вероятно, можете сделать это со сложными регулярными выражениями. Мне нравится следующий метод:

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

ничего похожего на тестирование, чтобы увидеть, что это не работает, когда строка находится в конце. Что - то около-0 = 0. Вот улучшение:

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

EDIT:

ваш пример работает, как когда я запускаю его на своем локальном 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

просто для полноты, вот решение с использованием регулярных выражений (не очень сложный IMHO : -)):

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

регулярное выражение

  • использует отрицаемый класс символов, чтобы соответствовать чему-либо, кроме точки [^.]
  • добавляет Квантор + чтобы соответствовать одному или нескольким из них
  • использует якорь $ чтобы ограничить совпадения до конца строки

и еще один способ.

Не уверен с точки зрения производительности, что было бы лучше...

разница здесь в том, что мы используем -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;

сколько точек в строке?

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

получить подстроку после последнего многоточия:

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