SQL Server如何提取字符串中的最后一段数值内容
在SQL Server中提取字符串末尾的连续数值部分
嘿,这个需求我之前处理过好几次,在SQL Server里要提取字符串末尾那串连续数字,咱们可以通过内置函数的组合来实现,下面分享两种实用的方法:
方法一:创建自定义函数(适合重复调用)
如果需要在多个查询里重复使用这个逻辑,最好封装成一个自定义函数,这样代码更整洁。
CREATE FUNCTION dbo.GetTrailingNumbers(@InputString VARCHAR(255)) RETURNS VARCHAR(255) AS BEGIN -- 先反转输入字符串,方便从末尾往前找非数字字符 DECLARE @ReversedString VARCHAR(255) = REVERSE(@InputString) -- 找到反转后第一个非数字字符的位置 DECLARE @FirstNonDigitPos INT = PATINDEX('%[^0-9]%', @ReversedString) -- 特殊情况:如果整个字符串都是数字,直接返回原字符串 IF @FirstNonDigitPos = 0 RETURN @InputString -- 截取反转字符串里的数字部分,再反转回来得到结果 RETURN REVERSE(LEFT(@ReversedString, @FirstNonDigitPos - 1)) END
测试函数效果
你可以用你的示例数据测试一下:
SELECT dbo.GetTrailingNumbers('SB124197') AS Result1, -- 返回 124197 dbo.GetTrailingNumbers('287276ACBX92') AS Result2, -- 返回 92 dbo.GetTrailingNumbers('R009321743-16') AS Result3, -- 返回 16 dbo.GetTrailingNumbers('12345') AS Result4 -- 返回 12345
方法二:直接用表达式(适合一次性查询)
如果只是单次查询需要这个结果,不用创建函数,直接写表达式就行,这里加了个小技巧处理全数字的情况:
SELECT InputString, REVERSE(LEFT(REVERSE(InputString), PATINDEX('%[^0-9]%', REVERSE(InputString) + 'X') - 1)) AS TrailingNumbers FROM ( VALUES ('SB124197'), ('287276ACBX92'), ('R009321743-16'), ('12345') ) AS t(InputString)
这里给反转后的字符串拼接了一个X,是为了避免当输入全是数字时,PATINDEX返回0导致减1出错的问题,这个小细节能让逻辑更健壮。
额外说明
如果你的字符串末尾没有数字,这两种方法都会返回空字符串。如果需要这种情况返回特定值(比如NULL),可以再加个CASE判断,比如:
CASE WHEN PATINDEX('%[0-9]%', @InputString) = 0 THEN NULL ELSE ... END
内容的提问来源于stack exchange,提问作者user3125637




