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

使用纯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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:52