如何在SQL中仅替换字符串第3到第6位字符,不替换其余匹配内容
问题原因
你原来的写法调用REPLACE时,会匹配原字符串里所有和第二个参数(也就是你截取的3-6位1234)完全一致的子串做全局替换,所以后面出现的两次1234也会被同步替换,不符合只改固定位置的需求。
通用解决方案(适配所有支持SUBSTR的数据库,包括Oracle、MySQL、PostgreSQL等)
直接拆分字符串做拼接,只修改指定位置的内容:
SELECT CONCAT( SUBSTR('DD123412341234', 1, 2), '1219', SUBSTR('DD123412341234', 7) ) FROM DUAL;
逻辑说明:
- 取原字符串前2位
DD - 拼接你要替换的内容
1219 - 拼接原字符串从第7位开始的剩余所有内容
数据库专属简化方案
MySQL
可以直接调用内置的INSERT函数完成指定位置替换:
SELECT INSERT('DD123412341234', 3, 4, '1219');
参数说明:INSERT(原字符串, 替换起始位置, 替换长度, 新内容)
支持正则的数据库(Oracle、MySQL 8.0+、PostgreSQL等)
如果需求是替换第一次出现的1234而非固定位置,可以用REGEXP_REPLACE限制替换次数:
SELECT REGEXP_REPLACE('DD123412341234', '1234', '1219', 1, 1) FROM DUAL;
最后两个参数分别表示:从第1位开始搜索、只替换第1次匹配到的结果。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

