2016-05-12 2 views
1

У меня есть столбец, в котором я хотел бы заменить определенный символ, проблема в том, что этот символ может находиться в середине строки или в конце. И я хочу только заменить этого персонажа, а не всех остальных.Oracle SQL replace Character

Например

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

Теперь я хочу, чтобы заменить S с заглавной S, но только с после 5 #:

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

Структура колонки всегда так , символ, который нужно заменить, всегда после 5-го. Замените wont work bc, если я ищу #s, тогда #stest получит #Stest.

ТНХ

ответ

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 блоков и заканчиваться «#» а затем заменяет «s» после 5-го блока своим «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 персонажа. Это может обрабатывать разные символы, без необходимости в hardcode 's'

+0

Thx для вашего ответа версия regexp была тем, что я искал. – rainer