2016-05-12 7 views
1

私はある文字を置き換えたいColumnを持っていますが、この文字は文字列の途中にあっても最後にあっても問題ありません。そして、私はこの文字を置き換えたいだけで、他の文字はすべて置き換えません。Oracle SQLの置換文字

Root#root#abc#test#stest#s#beta#402 
Root#root#abc#test#stest#s 

例えば

今は5#の後に大文字のSとSが、Sのみを交換したい:

Root#root#abc#test#stest#S#beta#402 
Root#root#abc#test#stest#S 

列の構造は次のように常にあります、置き換える文字は常に5番目の#の後になります。私が#sを検索すると、#stestが#Stestになります。

THX

答えて

3

あなたは(あなたの例では「S」)交換する一定の文字を持っている場合は、この使用することができます。

with test(string) as (select 'Root#root#abc#test#stest#s#beta#402' from dual) 
select regexp_replace(string, '(.*)#(.*)#(.*)#(.*)#(.*)#s', '\1#\2#\3#\4#\5#S') 
from test 

これは、と5つのブロック内の文字列をカットすると「#」を終了します5番目のブロックの後の 's'を 'S'に置き換えます。

あなたも、あなたのための発生をカウントするために正規表現を使用することができます。

select regexp_replace(string, '(([^#]*#){5,5})s', '\1S') 
from test 

これを5回記述する必要なしに、ブロックの正確5出現をカウントします。異なるアプローチで

は、正規表現せずに、あなたが試すことができます:

select substr(string, 1, instr(string, '#', 1, 5)) || 
     upper(substr(string, instr(string, '#', 1, 5)+1, 1)) || 
     substr(string, instr(string, '#', 1, 5) + 2) 
from test 

これは単に3部内の文字列をカットする(第5回「#」にbegiggingから、次の文字、残りの部分を)文字のupperを実行します。 これは異なる文字を扱うことができ、ハードコードする必要はありません

+0

Thxあなたの答えは、regexpバージョンが私が探していたものでした。 – rainer