如何在Microsoft SQL Server中检索恰好包含4个数字的行?
解决SQL Server中检索恰好包含4个数字的行的问题
你提到的SELECT * FROM table WHERE Name LIKE '%[0-9][0-9][0-9][0-9]%'确实会返回包含至少4个数字的行——不管字符串里总共有多少个数字,比如带5个、6个数字的记录也会被匹配到,因为这个语句只是检查字符串中是否存在连续或分散的4个数字片段,并没有限制数字的总数。
要准确筛选出恰好包含4个数字的行,我们可以通过计算字符串中数字的总个数来实现,下面分两种场景给出解决方案:
方案一:适用于SQL Server 2017及以上版本(支持TRANSLATE函数)
TRANSLATE函数可以批量替换字符,我们用它把所有数字替换为空字符串,再通过原字符串长度减去替换后的长度,得到数字的总个数,判断是否等于4:
SELECT * FROM table WHERE Name IS NOT NULL -- 避免NULL值干扰计算 AND LEN(Name) - LEN(TRANSLATE(Name, '0123456789', REPLICATE('', 10))) = 4;
方案二:适用于SQL Server 2016及以下版本(无TRANSLATE函数)
如果你的SQL Server版本不支持TRANSLATE,可以嵌套使用REPLACE函数逐个去掉所有数字字符,再计算长度差:
SELECT * FROM table WHERE Name IS NOT NULL AND LEN(Name) - LEN( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( Name, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '' ) ) = 4;
原理说明
两种方案的核心逻辑一致:
- 去掉字符串中所有的数字字符
- 原字符串长度减去去掉数字后的长度,得到的就是字符串中数字的总个数
- 当这个差值等于4时,就说明该字符串恰好包含4个数字
内容的提问来源于stack exchange,提问作者user8920029
相关产品推荐
相关产品推荐

