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 ...