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

Posted

技术标签:

【中文标题】如何仅在 Oracle SQL 中的字符串开头替换出现?【英文标题】:How to replace occurrence only on the start of the string in Oracle SQL? 【发布时间】:2016-12-18 08:47:59 【问题描述】:

我有一个源列,我想搜索以 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:正则表达式中的无效反向引用。

【问题讨论】:

你的第三个模式971971应该是9719715吗?是否可以概括 - 您是否真的要替换字符串中前 5 个字符的所有内容,或者保留任何值的最后 8 个字符?还是您不想修改其他值? 如果你可以控制它,最好修复数据模型。您应该有三列,而不是电话号码的一列:一列用于国家代码,一列用于区域(地区、省等)代码,一列用于实际号码。不幸的是,很多时候在这里发帖的人没有足够的权力做出这样的改变...... 【参考方案1】:

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

【讨论】:

以上是关于如何仅在 Oracle SQL 中的字符串开头替换出现?的主要内容,如果未能解决你的问题,请参考以下文章

sql 删去记录中指定字符开头的字符串

sql 替换指定字符串

如何动态替换sql中的表名

oracle 中如何将字符串中的英文单引号替换为右斜杠+英文单引号

Oracle sql 中的字符(串)替换与转换

总结Oracle sql 中的字符(串)替换与转换