web-dev-qa-db-ja.com

Oracle 12c-文字が最後に出現した後の文字列を選択します

以下の文字列があります:

ThisSentence.ShouldBe.SplitAfterLastPeriod.Sentence

つまり、最後のピリオドの後の文字列なので、Sentenceを選択します。これどうやってするの?

9
user3224907

おそらく、複雑な正規表現でこれを行うことができます。私は次の方法が好きです:

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
14
Gordon Linoff

完全を期すために、正規表現を使用したソリューションを次に示します(それほど複雑ではないIMHO :-))。

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

正規表現

  • 否定文字クラスを使用して、ドット以外のすべてに一致します[^.]
  • 数量詞+を追加して、これらの1つ以上に一致させます
  • アンカー$を使用して、一致を文字列の末尾に制限します
14
Frank Schmitt

そしてさらに別の方法。

最高のパフォーマンスの観点からはわかりません...

ここでの違いは、-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;
1
xQbert