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
相关产品推荐
相关产品推荐

