如何用SQL查询仅由特定字符组成的记录(不限长度)
解决方案:筛选全为'9'的MAC地址及指定CustID记录
作为SQL新手遇到这种精准匹配的需求很正常,别担心,我们可以通过正则表达式(或者针对特定数据库的替代方法)来实现你的需求,下面分不同数据库给出具体的查询语句,并解释每部分的作用:
核心思路
我们需要同时满足两个条件:
- CustID必须是
002、004、006、007中的一个 - MAC_Addr字段所有字符都是'9',不能包含任何其他字符(不管长度是多少)
1. MySQL/MariaDB 版本
SELECT CustID, MAC_Addr FROM your_table_name -- 替换成你的实际表名 WHERE CustID IN ('002', '004', '006', '007') AND MAC_Addr REGEXP '^9+$';
2. PostgreSQL 版本
SELECT CustID, MAC_Addr FROM your_table_name WHERE CustID IN ('002', '004', '006', '007') AND MAC_Addr ~ '^9+$';
3. SQL Server 版本
有两种常用写法:
写法一:用REPLICATE生成匹配字符串
SELECT CustID, MAC_Addr FROM your_table_name WHERE CustID IN ('002', '004', '006', '007') AND MAC_Addr LIKE REPLICATE('9', LEN(MAC_Addr));
写法二:用PATINDEX查找非'9'字符
SELECT CustID, MAC_Addr FROM your_table_name WHERE CustID IN ('002', '004', '006', '007') AND PATINDEX('%[^9]%', MAC_Addr) = 0;
4. Oracle 版本
SELECT CustID, MAC_Addr FROM your_table_name WHERE CustID IN ('002', '004', '006', '007') AND REGEXP_LIKE(MAC_Addr, '^9+$');
关键部分解释
CustID IN (...):精准筛选你需要的客户ID,如果你的CustID是数值类型(比如整数),可以去掉引号写成IN (2,4,6,7),如果是字符串类型则保留引号。- 正则表达式
^9+$:^表示字符串的开始位置9+表示匹配一个或多个连续的'9'$表示字符串的结束位置
组合起来就确保了整个MAC_Addr字段从开头到结尾只有'9',不会包含任何其他字符。
- SQL Server的REPLICATE方法:
REPLICATE('9', LEN(MAC_Addr))会生成一个和MAC_Addr长度完全相同的全'9'字符串,再用LIKE匹配,就能验证每个字符都是'9'。 - SQL Server的PATINDEX方法:
%[^9]%表示查找任何不是'9'的字符,如果PATINDEX返回0,说明整个字段里没有非'9'的字符,也就是全是'9'。
验证结果
根据你提供的测试数据,执行上述查询后会返回以下4条记录:
| CustID | MAC_Addr |
|---|---|
| 002 | 99999 |
| 004 | 999999999999 |
| 006 | 999 |
| 007 | 9 |
而CustID为001、003、005的记录会被正确排除,因为它们的MAC_Addr包含其他字符。
内容的提问来源于stack exchange,提问作者user3908166
相关产品推荐
相关产品推荐

