SQL Server - 如何获取给定字符串中的最后一个数值

时间:2018-01-17 14:03:02

标签: sql-server

我正在尝试获取给定字符串中的最后一个数字部分。

例如,下面是给定的字符串,结果应该只是最后一个数字部分

  • SB124197 - > 124197
  • 287276ACBX92 - > 92
  • R009321743-16 - > 16

如何实现此功能。请帮忙。

2 个答案:

答案 0 :(得分:4)

试试这个:

select right(@str, patindex('%[^0-9]%',reverse(@str)) - 1)

<强>解释

使用PATINDEX'%[^0-9]%'作为搜索模式,您可以获得数字第一次出现的起始位置

使用REVERSE,您可以从字符串后面开始获取第一个非数字字符的位置。

修改

要处理不包含非数字字符的字符串,可以使用:

select case 
          when patindex(@str, '%[^0-9]%') = 0 then @str
          else right(@str, patindex('%[^0-9]%',reverse(@str)) - 1)
       end

如果您的数据总是包含至少一个非数字字符,那么您可以使用第一个查询,否则使用第二个查询。

实际查询:

所以,如果你的表是这样的:

mycol
--------------
SB124197
287276ACBX92
R009321743-16
123456

然后您可以使用以下查询(适用于SQL Server 2012 +):

select iif(x.i = 0, mycol, right(mycol, x.i - 1))
from mytable
cross apply (select patindex('%[^0-9]%', reverse(mycol) )) as x(i)

<强>输出:

mynum
------
124197
92
16
123456

Demo here

答案 1 :(得分:1)

以下是使用Patindex

的一种方法
SELECT RIGHT(strg, COALESCE(NULLIF(Patindex('%[^0-9]%', Reverse(strg)), 0) - 1, Len(strg)))
FROM   (VALUES ('SB124197'),
               ('287276ACBX92'),
               ('R009321743-16')) tc (strg) 

在反转字符串后,我们找到第一个非数字字符的位置,并从该位置提取数据直到结束。

结果:

-----
124197
92
16