使用纯TSQL统计字符串中的数字字符数量(禁用正则表达式)
纯TSQL统计字符串中数字字符数量的方案
嘿,这事儿好办!我给你几个纯TSQL的实现方案,完全不用正则表达式,随便挑一个适合你场景的用:
方法1:替换差值法(简单直接)
这个思路很直观:把字符串里所有数字都替换成空字符串,用原字符串的长度减去替换后的长度,得到的就是数字的个数。
DECLARE @inputStr NVARCHAR(MAX) = 'kick0my234ass' SELECT LEN(@inputStr) - LEN(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @inputStr, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '')) AS DigitCount
运行结果:4
这个方法代码短,适合处理普通长度的字符串,缺点是要写10次REPLACE,但胜在简单易懂。
方法2:递归CTE遍历法(逻辑清晰)
通过递归CTE逐个提取字符串的每个字符,判断是否为数字并标记,最后求和得到总数。
DECLARE @inputStr NVARCHAR(MAX) = 'kick0my234ass' ;WITH CharCTE AS ( SELECT 1 AS Position, SUBSTRING(@inputStr, 1, 1) AS CurrentChar, CASE WHEN SUBSTRING(@inputStr, 1, 1) BETWEEN '0' AND '9' THEN 1 ELSE 0 END AS DigitFlag UNION ALL SELECT Position + 1, SUBSTRING(@inputStr, Position + 1, 1), CASE WHEN SUBSTRING(@inputStr, Position + 1, 1) BETWEEN '0' AND '9' THEN 1 ELSE 0 END FROM CharCTE WHERE Position < LEN(@inputStr) ) SELECT SUM(DigitFlag) AS DigitCount FROM CharCTE
运行结果:4
这个方法逻辑清晰,容易扩展(比如要统计其他类型字符也能改),适合处理较长的字符串。注意递归深度默认是100,如果字符串超过100字符,需要加OPTION (MAXRECURSION 0)来取消限制。
方法3:数字辅助表法(高效处理长字符串)
如果你的数据库里有现成的数字表最好,没有的话可以临时生成一个,用数字序列逐个提取字符并判断。
DECLARE @inputStr NVARCHAR(MAX) = 'kick0my234ass' -- 临时生成数字序列,长度和输入字符串一致 ;WITH Numbers AS ( SELECT TOP (LEN(@inputStr)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM sys.all_columns ) SELECT COUNT(*) AS DigitCount FROM Numbers WHERE SUBSTRING(@inputStr, N, 1) BETWEEN '0' AND '9'
运行结果:4
这个方法在处理超长字符串时效率比递归高,因为避免了递归的开销,数字表也可以复用,适合频繁处理这类需求的场景。
内容的提问来源于stack exchange,提问作者liquid
相关产品推荐
相关产品推荐

