0

我有一个源列,我想搜索以 05、5 971971 和 97105 开头的字符串值以替换为 9715。如输出表所示。

SOURCE OUTPUT 0514377920 971514377920 544233920 971544233920 971971511233920 971511233920 9710511233920 971511233920

我尝试了以下适用于第一种情况的方法。

SELECT REGEXP_REPLACE ('0544377905', '^(\05*)', '9715')FROM dual;

但是对于第二种情况,以下不起作用:

SELECT REGEXP_REPLACE ('544377905', '^(\5*)', '9715')FROM dual;

我的正则表达式有问题。正如我得到的:ORA-12727:正则表达式中的无效反向引用。

4

1 回答 1

2

您可以使用交替提供四种模式;也就是说,在括号中,它们之间有一个竖线:

with t(source) as (
  select '0514377920' from dual
  union all select '544233920' from dual
  union all select '971971511233920' from dual
  union all select '9710511233920' from dual
)
SELECT source, REGEXP_REPLACE (source, '^(05|5|9719715|97105)', '9715') as output
FROM t;

SOURCE          OUTPUT             
--------------- --------------------
0514377920      971514377920        
544233920       971544233920        
971971511233920 971511233920        
9710511233920   971511233920        

根据您的数据和您拥有的任何其他限制,您可以让它变得简单,就像替换其中包含 5 的任何字符串的第一部分一样,这适用于您的小样本:

SELECT source, REGEXP_REPLACE (source, '^.[^5]?5', '9715') as output
FROM t;

这匹配零个或多个不是 5 的字符,然后是 5。不过,这对于您的实际情况可能过于简单。

于 2016-08-11T14:49:22.447 回答