2016-05-12 46 views
1

我有一列想在其中替換某個字符,問題是這個字符可以在字符串中間或末尾。我只想替換這個角色,而不是所有其他角色。Oracle SQL替換字符

例如

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

現在我想以一個大寫s到取代秒,但在5#後,只有S:

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

柱的結構永遠是這樣,要替換的字符總是在第5#之後。替換不會工作BC如果我搜索#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個部分字符串(從begigging到5「#」,下面的字符,剩餘部分)並且確實是角色的upper。 這可以處理不同的字符,不需要硬編碼的'

+0

Thx爲您的答案,正則表達式版本是我正在尋找。 – rainer