以下の文字列があります:
ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence
つまり、最後のピリオドの後の文字列なので、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で実行したときと 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つ以上に一致させます$
を使用して、一致を文字列の末尾に制限しますそしてさらに別の方法。
最高のパフォーマンスの観点からはわかりません...
ここでの違いは、-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;