问题如:
需要将表 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。[该想法未经证实]
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于