在Oracle查询中替换动态创建的Substring

时间:2016-03-24 08:10:24

标签: sql oracle oracle11g

我正在使用Oracle 11g数据库,其中包含数据,其中我想使用oracle查询用虚拟文本替换动态生成的文本。例如,我的表中的列包含数据: Hello Mike, Your registered no. is 3525. Kindly check the same

现在的问题是,客户名称即'Mike'可能是动态的,这就是我无法使用SUBSTR功能的原因。我想用XXXX替换3525 E.g Hello Mike, Your registered no. is XXXX. Kindly check the same

请帮我解决这个问题。我正在使用Oracle 11g

3 个答案:

答案 0 :(得分:2)

如果您字符串中唯一的动态部分是名称(假设名称不包含数字......),您可以尝试:

select regexp_replace('Hello Mike, Your registered no. is 3525. Kindly check the same',
                      '([0-9])',
                      'X'
                     )
from dual

这只是用'X'替换每个数字字符。

要使用固定字符串替换“AB3525”之类的内容,例如“XXXX”,您可以尝试将其替换为固定字符:

select regexp_replace('Hello Mike, Your registered no. is AB3525. Kindly check the same',
                      '(Hello [^\,]*\, Your registered no. is )([^\.]*)(\. Kindly check the same)',
                      '\1XXXX\3'
                     )            
from dual    

答案 1 :(得分:2)

您可以使用 TRANSLATE ,这比 REGULAR EXPRESSION 快得多。它只会出现X的数字。

例如,

SQL> SELECT TRANSLATE('Hello Mike, Your registered no. is 3525. Kindly check the same',
  2                   '0123456789',
  3                   'XXXXXXXXXX') str
  4  FROM dual;

STR
--------------------------------------------------------------
Hello Mike, Your registered no. is XXXX. Kindly check the same

SQL>

答案 2 :(得分:1)

这是另一种方法:您可以在多个表达式中拆分字符串,并使用\{position number}

访问匹配项
select regexp_replace('Hello Mike, Your registered no. is 3525. Kindly check the same',
                      '(Hello )(.*)(, Your registered no. is )(.*)(. Kindly check the same)',
                      'Hello \2, Your registered no. is [xxx]. Kindly check the same'
                     )
from dual