如何仅在 Oracle SQL 中的字符串开头替换出现?

How to replace occurrence only on the start of the string in Oracle SQL?

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

SOURCE OUTPUT 0514377920 971514377920 544233920 971544233920 971971511233920 971511233920 9710511233920 971511233920

我试过以下方法适用于第一种情况。

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

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

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

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

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

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。不过,对于您的实际情况,这可能过于简单了。