You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:54:04