【问题标题】:Oracle SQL replace CharacterOracle SQL 替换字符
【发布时间】:2016-05-12 17:12:31
【问题描述】:

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

例如

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,替换将不起作用,那么#stest 将得到#Stest。

谢谢

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    如果你有一个固定的字符来替换(在你的例子中是'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 个“#”,下一个字符,剩余部分)并执行字符的upper。 这可以处理不同的字符,无需硬编码's'

    【讨论】:

    • 感谢您的回答,正则表达式版本正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多