mysql 反向匹配子串_MySQL 中批量将字符串的某个指定子串替换成另一个子串

问题如:

clipboard.png

需要将表 model_basic 中 MODELURL 字段的“manage.zaiguiyang.com”全部替换成“manage.zaichengdu.com"

SQL 语句的写法是:

UPDATE model_basic SET MODELURL = replace(MODELURL,'manage.zaiguiyang.com','manage.zaichengdu.com');

延伸

replace 的用法:

REPLACE(str,from_str,to_str)

将 str 中所有的 from_str 替换成 str,然后返回。该函数对大小写敏感和多字节编码安全。

|

mysql> SELECT REPLACE('[www.mysql.com](http://www.mysql.com/)', 'w', 'Ww');

-> 'WwW[wWw.mysql.com](http://www.mysql.com/)'

|

一些其他的实现方式:

使用 CONCAT(str1,str2,...)、FIND_IN_SET(str,strlist)、CHAR_LENGTH()、MID(str,pos,len)三个函数组合实现。

实现思路:

先计算出‘manage.zaiguiyang.com’在整个字符串中的起始位置和长度,使用到:find_in_set 和 char_length 两个函数

然后使用 mid 函数将'manage.zaiguiyang.com'前后的子串截下来

最后通过 concat 函数将三个子串按顺序连接起来

SQL 语句:

UPDATE

model_basic

SET

MODELURL = CONCAT (

MID( MODELURL, 0, FIND_IN_SET( MODELURL, 'manage.zaiguiyang.com' ) ),

'manage.zaichengdu.com',

MID(

MODELURL,

FIND_IN_SET( MODELURL, 'manage.zaiguiyang.com' ) + CHAR_LENGTH( 'manage.zaiguiyang.com' ),

CHAR_LENGTH( MODELURL ) - FIND_IN_SET( MODELURL, 'manage.zaiguiyang.com' ) - CHAR_LENGTH( 'manage.zaiguiyang.com' )

)

);

这个方案与使用 replace 实现的方案中的区别在于,使用 replace 实现时会将字符串中所有的 from_str 都换掉,而使用 concat 的拼接实现仅仅会替换掉第一个 from_str

不同实现方式的效率问题:

在源字符串特别长的情况下,使用 concat 实现在理论上效率是优于 replace。所以,在明知道源字符串中有且仅有一个 from_str 的时候,选用 concat 效果好。但是在不明确的情况下,还是需要使用 replace。[该想法未经证实]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值