【问题标题】:Oracle Regexp_replace multiple occurrenceOracle Regexp_replace 多次出现
【发布时间】:2014-12-02 22:27:57
【问题描述】:

您好,如果字符串以数字开头,我想将字母 C 附加到字符串中。 此外,如果它有任何标点符号,则用下划线_替换 例如:5-2-2-1 ==> C5_2_2_1

我试过了,但我无法替换多次出现的标点符号。我错过了一些简单的东西,我无法得到它。

SELECT  REGEXP_REPLACE('9-1-1','^(\d)(-),'C\1_' ) FROM DUAL;

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:
    SELECT case when REGEXP_LIKE('9-1-1','^[[:digit:]]') then 'C' END 
           || REGEXP_REPLACE('9-1-1', '[[:punct:]]', '_')
    FROM DUAL;
    

    [:digit:] 任意数字
    [:punct:] 标点符号

    如果您有很多具有不同值的行,请尽量避免使用正则表达式:

    SELECT case when substr('9-1-1',1,1) between '0' and '9' then 'C' end
           || translate('9-1-1', ',.!-', '_')
    FROM DUAL;
    

    在这里查看例如:Performance of regexp_replace vs translate in Oracle?

    【讨论】:

    • 非常感谢它有效!我只是试图最小化多个功能,因为我将扫描数百万行
    • @Raj A 我添加了更多信息。我不知道数百万行
    • 非常感谢您的努力和链接!!
    【解决方案2】:

    试试这个:

    select (case when substr(val, 1, 1) between '0' and '9' then 'C' else '' end) ||
           regexp_replace(val, '([-+.,;:'"!])', '_')
    

    【讨论】:

    • 非常感谢您的快速回复!!,只是出于好奇,如果有办法在一次正则表达式函数中做到这一点
    • @RajA 。 . .我不认为有一种方法可以用一个函数来做到这一点。
    • ..嗯,我在想,如果我们能捕捉到不止一次出现的角色..但没关系,我会用这个..再次感谢
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2018-09-20
    • 2014-05-28
    • 2017-12-07
    • 2018-10-07
    • 2018-04-23
    相关资源
    最近更新 更多