MySQL中如何删除school字段末尾最后一个'-'后的城市名称内容
问题原因
你之前写的正则规则是匹配连续两个- 结构,和你要识别的末尾单个- 城市名格式不符,所以匹配不到结果。
解决方法
1. MySQL 8.0+ 版本(推荐,直接用内置正则替换函数)
直接用REGEXP_REPLACE一键清理,不需要额外判断:
SELECT REGEXP_REPLACE(school, '\\s-\\s[^-]+$', '') AS cleaned_school FROM table_name;
如果要先筛选出需要清理的数据做验证,执行以下查询:
SELECT school FROM table_name WHERE school REGEXP '\\s-\\s[^-]+$';
规则说明:
\\s-\\s匹配前后带空格的横杠分隔符[^-]+$匹配从分隔符开始到字符串末尾、不包含横杠的所有内容,刚好对应最后一段的城市信息- 即使学校名称中间本身带有横杠分隔的其他内容,也只会删除末尾最后一段的城市部分,符合需求
2. MySQL 5.x 版本(无正则替换函数,用字符串截取实现)
通过反转字符串定位最后一个横杠分隔符的位置,再做截取:
SELECT IF( LOCATE('- ', REVERSE(school)) > 0, LEFT(school, CHAR_LENGTH(school) - LOCATE('- ', REVERSE(school)) - 1), school ) AS cleaned_school FROM table_name;
逻辑说明:
- 先反转school字段的值,找到第一个出现
-的位置,对应原字符串最后一个-的位置 - 如果存在该分隔符,就截取原字符串从开头到分隔符前的内容,否则返回原字符串
- 用
CHAR_LENGTH而不是LENGTH是为了兼容中文、法语等多字节字符的情况,避免截断错误
数据更新语句
确认清洗规则没问题后,可以执行更新操作修改原有数据:
-- MySQL 8.0+ 版本更新 UPDATE table_name SET school = REGEXP_REPLACE(school, '\\s-\\s[^-]+$', ''); -- MySQL 5.x 版本更新 UPDATE table_name SET school = LEFT(school, CHAR_LENGTH(school) - LOCATE('- ', REVERSE(school)) - 1) WHERE LOCATE('- ', REVERSE(school)) > 0;
内容的提问来源于stack exchange,提问作者aki2all
相关产品推荐
相关产品推荐

