You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动