Oracle SQL替换字符

时间:2016-05-12 08:54:03

标签: sql regex oracle

我有一个列,其中我想替换某个字符,问题是这个字符可以在字符串的中间还是在结尾处。我只想替换这个角色,而不是所有其他角色。

例如

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

现在我想用大写的S替换s,但只用5之后的s替换。#:

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

列的结构总是这样,要替换的字符总是在第5个#之后。如果我搜索#s,则取代不工作bc然后#stest将获得#Stest。

THX

1 个答案:

答案 0 :(得分: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。 这可以处理不同的字符,无需硬编码's'