MySQL中修改字段值的前缀或后缀

背景:

因为项目整合需要,需要将几个子项目整合成一个项目发布,但之前开发过程中设置跳转的URL前缀是以各个子项目前缀命名的,现在需要将那些子项目的前缀统一成一个名字。因此需要修改保存URL数据表中的记录的前缀。

如下图所示:需要将FORMURL字段保存的值中前缀为rollsr值修改成前缀为sw,其他值不变。


分析:

1. 修改数据表中的值

最常见的思路有两种:

  1. 修改时用子查询限定修改的内容,并设置对应的值。(这种设置的值比较固定)
  2. 修改时用case when搜索限定修改的内容和值。(设置的值当成变量处理,非常灵活)

针对这儿修改前缀的情况,它修改后的值不是固定的,所以最佳做法是使用case when处理,这种可将设置的值当成变量的形式处理。

2.字符串前缀处理

  1. 处理字符串,首先想到的就是用 CONCAT(str,str1 ...) 拼接字符串,将前缀 sw 放在最前面,然后拼接上 URL 前缀后面的部分就可以了。
  2. 那么如何取 URL 前缀后面的那部分呢?
  • 字符串截取:RIGHT(str, n) 返回字符串 str 的后 n 个字符;
  • 根据上面函数,我们只需要知道字符串总长度和前缀长度就可以得到n。要知道字符串的长度,用 CHAR_LENGTH(str) 取到字符串的长度;
  • 要知道前缀长度,可根据前缀后面的分割符所在位置取到。LOCATE(subStr, str) :从字符串 str 中获取 subStr 的开始位置,找不到返回0。

若处理的是字符串后缀,可用类似的方式处理。


实现:

test_table为表名,FORMURL为需要修改的属性名。

UPDATE test_table
SET FORMURL = (
-- CASE	WHEN 搜索函数
	CASE
	WHEN (
-- 搜索这两种条件
		(FORMURL LIKE 'sr%')
		OR (FORMURL LIKE 'roll%')
	) THEN
-- 字符串拼接
		CONCAT(
			'sm',
-- 字符串截取:获取前缀后面部分字符串
			RIGHT (
				FORMURL,
-- 计算出前缀后面部分长度
				(CHAR_LENGTH(FORMURL) - LOCATE('System', FORMURL) + 1)
			)
		)
	ELSE
-- 若没有搜索到对应的结果,则不改变值。注意:如果不加这个,若没搜索到对应的结果就会将该属性值置为空
		FORMURL
	END
);

总结:

  1. CASE WHEN的搜索用法非常强大且灵活,在做数据修复SQL时第一个想到的就是它。
  2. MySQL内置的字符串处理函数非常丰富,上面的处理方法不一定是最佳的,可了解更多的字符串处理函数优化SQL。贴出MySQL内置函数,供以后学习参考:https://www.runoob.com/mysql/mysql-functions.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值