2016-06-15 11 views
0

のN番目とM番目のoccuranceの間のsubstrを選択たとえば、URLなどです。スラッシュの2番目と4番目の出現の間に部分文字列を取得したい場合は、2番目のスラッシュに続くすべてのものが必要です。PLSQLは、私は複数のスラッシュを含む文字列を持っている...私はまさにこの問題の簡単な関数があると確信しているが、私はそれを見つけることができないよう</p> <p>を文字

したがって、'ab/cd/ef/gh/ij''ef/gh'と選択し、'abc/d'''として選択する必要があります。

私が探している機能の魔法の組み合わせは何ですか? substrとregexp_substrを使って遊んだりしようとしましたが、望みの結果を出さずにかなり速く乱雑になりました。

答えて

1

どうやら私は十分に勉強していませんでした。機能instrsubstrとそれゆえの組み合わせで、トリックを行います。

SUBSTR(string, INSTR(string,'/',1,2) + 1, INSTR(string,'/',1,4) - INSTR(string,'/',1,2)-1) 

それでも創造性は歓迎以上である、しかし私に汚いのようなものを探します。

+0

これは私が通常行う方法とほぼ同じです。あなたのコードの残りの部分がきれいに見えるように、関数内にカプセル化してください:) –

0

これを試してください。私は、正規表現の単純化することができると思うが、それはあなたの要件を満たしています。 case文の文字列に対してテストを行う順序は、strが間違ったテストにならないように、非常に重要であることに注意してください。

with tbl(rownbr, str) as (
    select 1, 'ab/cd/ef/gh/ij/x/x/x' from dual union 
    select 2, 'aa/bb/cc'    from dual union 
    select 3, 'gg/hh/ii/jj'   from dual union 
    select 4, 'abc/d'    from dual union 
    select 5, 'zz'     from dual 
) 
select rownbr, 
     case 
     when regexp_count(str, '/') > 4 then 
      regexp_replace(str, '^.*?/.*?/(.*?/.*?)/.*$', '\1') 
     when regexp_count(str, '/') < 2 then 
      NULL  
     when regexp_count(str, '/') < 4 then 
      regexp_replace(str, '^.*?/.*?/(.*)$', '\1') 
     end result 
from tbl; 
関連する問題