如何仅在 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 中的字符串开头替换出现?的主要内容,如果未能解决你的问题,请参考以下文章