MySQL查询排除特定字符串组合的语法示例咨询
MySQL排除重复前后缀拼接字符串实现方案
以下实现针对单个短横线分隔、前后两段字符串完全相同的字段值(比如Finance-Finance、Admin-Admin这类)的排除需求,分两种常用实现:
方案1:字符串函数拆分对比(兼容所有MySQL版本)
核心逻辑是拆分分隔符前后的内容做等值判断,不需要依赖正则支持,兼容性最高:
-- 示例表名:org_data,过滤字段:dept_tag SELECT * FROM org_data WHERE -- 可选校验:仅保留包含且仅包含1个短横线的值,可根据业务需求删除该条件 LENGTH(dept_tag) - LENGTH(REPLACE(dept_tag, '-', '')) = 1 AND -- 对比短横线前后两段内容,不相等的才返回(即排除前后一致的无效值) SUBSTRING_INDEX(dept_tag, '-', 1) != SUBSTRING_INDEX(dept_tag, '-', -1);
参数调整说明:
- 把
org_data替换为实际表名,dept_tag替换为要过滤的字段名 - 如果分隔符不是短横线,将语句中所有
'-'替换为实际分隔符即可 - 如果要同时忽略大小写差异,将两个拆分函数的返回值用
LOWER()包起来再对比即可
方案2:正则匹配(适用MySQL 8.0及以上版本)
用反向引用正则直接匹配规则,写法更简洁:
SELECT * FROM org_data WHERE dept_tag NOT REGEXP '([^-]+)-\\1';
正则规则说明:
([^-]+):捕获组,匹配所有连续的非短横线字符\\1:反向引用,匹配和第一个捕获组完全相同的内容- 整体匹配所有符合「X-X」格式的字符串,用
NOT REGEXP直接排除这类值
如果需要直接删除表中这类无效数据,参考语句:
DELETE FROM org_data WHERE LENGTH(dept_tag) - LENGTH(REPLACE(dept_tag, '-', '')) = 1 AND SUBSTRING_INDEX(dept_tag, '-', 1) = SUBSTRING_INDEX(dept_tag, '-', -1);
内容的提问来源于stack exchange,提问作者New Member-82
相关产品推荐
相关产品推荐

