背景:
因为项目整合需要,需要将几个子项目整合成一个项目发布,但之前开发过程中设置跳转的URL前缀是以各个子项目前缀命名的,现在需要将那些子项目的前缀统一成一个名字。因此需要修改保存URL数据表中的记录的前缀。
如下图所示:需要将FORMURL字段保存的值中前缀为roll和sr值修改成前缀为sw,其他值不变。
分析:
1. 修改数据表中的值
最常见的思路有两种:
- 修改时用子查询限定修改的内容,并设置对应的值。(这种设置的值比较固定)
- 修改时用case when搜索限定修改的内容和值。(设置的值当成变量处理,非常灵活)
针对这儿修改前缀的情况,它修改后的值不是固定的,所以最佳做法是使用case when处理,这种可将设置的值当成变量的形式处理。
2.字符串前缀处理
- 处理字符串,首先想到的就是用 CONCAT(str,str1 ...) 拼接字符串,将前缀 sw 放在最前面,然后拼接上 URL 前缀后面的部分就可以了。
- 那么如何取 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
);
总结:
- CASE WHEN的搜索用法非常强大且灵活,在做数据修复SQL时第一个想到的就是它。
- MySQL内置的字符串处理函数非常丰富,上面的处理方法不一定是最佳的,可了解更多的字符串处理函数优化SQL。贴出MySQL内置函数,供以后学习参考:https://www.runoob.com/mysql/mysql-functions.html