2016-05-12 23 views
1

Ich habe eine Spalte, in der ich ein bestimmtes Zeichen ersetzen möchte, das Problem ist dieses Zeichen kann in der Mitte der Zeichenfolge oder am Ende sein. Und ich möchte nur diesen Charakter ersetzen und nicht alle anderen.Oracle SQL ersetzen Zeichen

Zum Beispiel

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

Jetzt möchte ich die s mit einem Groß S ersetzen, sondern nur die s nach dem 5. #:

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

Die Struktur der Säule ist immer so , der zu ersetzende Charakter ist immer nach der 5. #. Ersetzen funktioniert nicht, wenn ich nach #s suche, dann würde #estest #Stest bekommen.

thx

Antwort

3

Wenn Sie einen festen Charakter haben zu ersetzen ('s' in Ihrem Beispiel), können Sie diese verwenden:

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 

Dies schneidet die Zeichenfolge in 5 Blöcke mit und endend '#' und ersetzt dann das 's' nach dem fünften Block mit seinem 'S'.

Sie können sogar regexp verwenden, um die Ereignisse für Sie zu zählen:

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

Dies gilt genau 5 Vorkommen des Blocks, ohne dass es 5-mal zu schreiben.

Mit einem anderen Ansatz, ohne regexp, können Sie versuchen:

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 

Dieses einfach die Zeichenfolge in 3 Teile schneidet (vom begigging bis 5. ‚#‘, das folgende Zeichen, der verbleibende Teil) und tut upper des Charakters. Dies kann verschiedene Zeichen, ohne Notwendigkeit, 's'

+0

hardcodieren müssen Thx für Ihre Antwort, die Regexp-Version war, was ich gesucht habe. – rainer