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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:27:16