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')
期望结果
| ID | code |
|---|---|
| 1 | 10015662 |
| 2 | 100040344 |
| 3 | 10015370 |
| 4 | NULL |
| 5 | 400337 |
解决方案
你的现有代码逻辑是从字符串末尾往前找第一个非数字字符,再截取后续数字,但如果最后一组数字后还有非数字内容,这个逻辑就失效了。以下是几种可行的解决方法:
方法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
相关产品推荐
相关产品推荐

