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

SQL提取字符串中最后一个数字:现有方法存局限求解决方案

提取字符串中的最后一组数字

我需要从字符串里提取最后一组连续数字,但目前写的代码只能提取位于字符串末尾的数字,非末尾的目标数字提取不出来,求解决办法。

现有代码

right(TextDescription, patindex('%[^0-9]%',reverse(TextDescription)) - 1)

示例数据

Create Table #TestData
(
    ID int,
    TextDescription varchar(100)
)

insert into #TestData Values (1,'Data From JOE BLOGGS 10015662 tree 10015662')
insert into #TestData Values (2,'Fast Data From JOHN SMITH 10004034 MARY SMITH 100040344 plant')
insert into #TestData Values (3,'Data In 10015370 pot JONES')
insert into #TestData Values (4,'Fast Data From LEE tree')
insert into #TestData Values (5,'Direct Data 106600 JANE GREEN 400337')

期望结果

IDcode
110015662
2100040344
310015370
4NULL
5400337

解决方案

你的现有代码逻辑是从字符串末尾往前找第一个非数字字符,再截取后续数字,但如果最后一组数字后还有非数字内容,这个逻辑就失效了。以下是几种可行的解决方法:

方法1:反转字符串定位最后一组数字

通过反转字符串,先找到第一个数字的起始位置,再定位该数字组后的第一个非数字位置,计算出数字组长度后从原字符串截取:

SELECT 
    ID,
    CASE 
        WHEN PATINDEX('%[0-9]%', TextDescription) = 0 THEN NULL
        ELSE RIGHT(
            TextDescription,
            PATINDEX('%[^0-9]%', REVERSE(TextDescription) + 'X') - 1
            - (LEN(TextDescription) - CHARINDEX(' ', REVERSE(TextDescription) + ' ', PATINDEX('%[0-9]%', REVERSE(TextDescription))))
        )
    END AS code
FROM #TestData

方法2:使用STRING_SPLIT(SQL Server 2016+)

将字符串按空格拆分,筛选出全为数字的片段,取最后一个匹配项:

SELECT 
    td.ID,
    (SELECT TOP 1 value 
     FROM STRING_SPLIT(td.TextDescription, ' ') 
     WHERE TRY_CAST(value AS BIGINT) IS NOT NULL 
     ORDER BY CHARINDEX(' ' + value + ' ', ' ' + td.TextDescription + ' ') DESC) AS code
FROM #TestData td

方法3:正则表达式匹配(需CLR函数支持)

如果你的SQL Server启用了CLR集成,可以创建自定义正则函数,用\d+(?!.*\d)匹配最后一组数字(该正则表示匹配后续无其他数字的连续数字组):

-- 假设已创建正则匹配函数dbo.RegexMatch
SELECT 
    ID,
    dbo.RegexMatch(TextDescription, '\d+(?!.*\d)') AS code
FROM #TestData

内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:50:14