如何在SQL中筛选ref_id字段8-10位为数字+XX格式的记录
统计符合格式的ref_id记录数解决方案
嘿,我来帮你搞定这个统计需求!你要找的是ref_id字段第8-10位为「数字+XX」(比如2XX、8XX)的记录数,之前用:digit:没成功,大概率是用了非通用的SQL正则语法,这里给你两种靠谱的方案:
方案一:字符串截取法(兼容性拉满)
这种方法不用依赖正则,直接定位字符位置判断,几乎所有SQL数据库都支持,不容易踩语法坑:
SELECT COUNT(*) AS matching_records FROM your_table_name -- 核心逻辑:第8位是数字,第9、10位随便什么字符(对应XX) WHERE SUBSTRING(ref_id, 8, 1) BETWEEN '0' AND '9' -- 如果XX要求必须是字母,就加个判断: -- AND (SUBSTRING(ref_id, 9, 2) BETWEEN 'A' AND 'Z' OR SUBSTRING(ref_id, 9, 2) BETWEEN 'a' AND 'z')
小说明:
SUBSTRING(ref_id, 8, 1)是截取第8个字符,注意绝大多数SQL数据库的字符串索引是从1开始的,不是0哦- 用
BETWEEN '0' AND '9'判断数字比正则更稳妥,不会因为数据库正则语法差异出问题
方案二:正则表达式法(更简洁)
如果你偏爱正则,得用对应数据库支持的语法,别再用:digit:啦,下面是主流数据库的正确写法:
MySQL/MariaDB:
SELECT COUNT(*) AS matching_records FROM your_table_name WHERE ref_id REGEXP '^.{7}[0-9].{2}'
- 拆解一下:
^.{7}匹配开头7个任意字符,[0-9]匹配第8位的数字,.{2}匹配第9、10位的任意两个字符
PostgreSQL:
SELECT COUNT(*) AS matching_records FROM your_table_name WHERE ref_id ~ '^.{7}\d.{2}'
- PostgreSQL用
~表示正则匹配,\d就是数字的等价写法
SQL Server:
SQL Server对正则支持有限,用LIKE反而更直接:
SELECT COUNT(*) AS matching_records FROM your_table_name WHERE ref_id LIKE '_______[0-9]__'
- 每个
_代表一个任意字符,7个_对应前7位,[0-9]对应第8位的数字,最后两个_对应XX
额外提醒:
别忘了加个长度判断LENGTH(ref_id) >= 10,避免那些长度不够10位的记录干扰统计,比如:
SELECT COUNT(*) AS matching_records FROM your_table_name WHERE LENGTH(ref_id) >= 10 AND SUBSTRING(ref_id, 8, 1) BETWEEN '0' AND '9'
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

