SQL如何查询筛选表中字段值仅含1个破折号的记录
筛选Name字段仅含1个破折号的记录方案
你之前用的LIKE '%-%'仅能判断字段是否存在至少1个破折号,无法统计出现次数,要实现次数筛选可以用以下两种方案:
方案1:字符串长度差值法(全数据库通用)
实现原理:破折号的出现次数 = 原字符串长度 - 移除所有破折号后的字符串长度,筛选差值等于1的记录即可。
注意:你的示例数据中Id=5的记录使用的是长破折号–(en dash),和普通半角短破折号-是不同字符,需要兼容的话要同时处理两种字符。
-- MySQL/PostgreSQL/Oracle 写法,兼容长短两种破折号 SELECT * FROM products WHERE LENGTH(Name) - LENGTH(REPLACE(REPLACE(Name, '-', ''), '–', '')) = 1;
- SQL Server 适配:把上述语句中的
LENGTH替换为LEN即可,其余逻辑不变。 - 如果不需要兼容长破折号,去掉内层嵌套的
REPLACE,只保留对半角短破折号-的替换即可。
方案2:正则匹配法(支持正则的数据库适用)
如果使用的是MySQL 8.0+、PostgreSQL等支持正则查询的引擎,可以直接用正则限制整个字符串仅出现1次破折号,写法更简洁:
-- MySQL 正则写法,兼容长短破折号 SELECT * FROM products WHERE Name REGEXP '^[^-–]*[-–][^-–]*$';
正则逻辑说明:
^匹配字符串起始位置[^-–]*匹配0到多个非破折号字符[-–]匹配1个破折号(覆盖长短两种格式)[^-–]*匹配破折号之后0到多个非破折号字符$匹配字符串结束位置
执行上述任意一种方案,都会返回你预期的Id=1、3、5的三条记录,自动过滤包含2个及以上破折号的记录。
内容的提问来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

