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

SQL Server中动态去除VARCHAR末尾数字及前缀公司名的问题

解决SQL Server中动态去除LoginID末尾任意长度数字的问题

正确实现语句

可以通过先提取\后的用户名部分,再结合REVERSE和PATINDEX定位末尾连续数字的起始位置,最终截取纯用户名:

SELECT 
    LoginId,
    SUBSTRING(
        username_part,
        1,
        LEN(username_part) - (PATINDEX('%[^0-9]%', REVERSE(username_part)) - 1)
    ) AS Name
FROM (
    -- 先提取\之后的用户名+数字部分
    SELECT 
        LoginId,
        SUBSTRING(LoginID, CHARINDEX('\\', LoginID) + 1, LEN(LoginID)) AS username_part
    FROM dbo.Tester
) AS sub_query

执行后会得到期望结果:

LoginId                     Name
Tata-Motors\\Harry9          Harry
Orian-Analytics\\Kartik10    Kartik
adventure-works\\Darshana3   Darshana

兼容无数字的边界情况

如果存在末尾无数字的LoginID,可以加CASE判断避免错误:

SELECT 
    LoginId,
    CASE 
        -- 检查是否存在数字
        WHEN PATINDEX('%[0-9]%', username_part) > 0 THEN
            SUBSTRING(
                username_part,
                1,
                LEN(username_part) - (PATINDEX('%[^0-9]%', REVERSE(username_part)) - 1)
            )
        ELSE username_part
    END AS Name
FROM (
    SELECT 
        LoginId,
        SUBSTRING(LoginID, CHARINDEX('\\', LoginID) + 1, LEN(LoginID)) AS username_part
    FROM dbo.Tester
) AS sub_query

原语句错误原因

你之前的语句报错是因为PATINDEX('%[0-9]%', LoginId)是在整个LoginID字符串中查找第一个数字的位置,而非\之后的子串。这会导致计算SUBSTRING的长度参数时出现负数,触发Invalid length parameter passed to the LEFT or SUBSTRING function错误。

比如对于Tata-Motors\\Harry9,整个字符串中第一个数字在末尾的第19位,计算长度时:
LEN(LoginID)-CHARINDEX('\\', LoginID)-PATINDEX(...) = 19 - 13 - 19 = -13,负数参数直接导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:50:21