求助:SQL Server中如何移除混合字符串末尾的数字?
在SQL Server中移除字符串末尾的数字
要实现仅移除字符串末尾的连续数字、保留其余所有内容的需求,可以通过组合使用REVERSE、PATINDEX和LEFT函数来完成,以下是具体方案:
核心逻辑
- 反转目标字符串,从反转后的开头(对应原字符串的末尾)查找第一个非数字字符的位置;
- 根据该位置计算原字符串需要保留的长度,截取对应部分即可。
直接查询示例
SELECT OriginalString, CASE -- 处理全数字的边界情况,可根据需求返回原字符串或空值 WHEN PATINDEX('%[^0-9]%', REVERSE(OriginalString)) = 0 THEN OriginalString ELSE LEFT(OriginalString, LEN(OriginalString) - PATINDEX('%[^0-9]%', REVERSE(OriginalString)) + 1) END AS TrimmedString FROM ( -- 测试用例 VALUES ('abcd-1-efgh12'), -- 预期结果:abcd-1-efgh ('xyz789abc111'), -- 预期结果:xyz789abc ('123test456'), -- 预期结果:123test ('onlytext'), -- 预期结果:onlytext ('12345') -- 全数字,返回原字符串 ) AS T(OriginalString)
封装为自定义函数(复用场景)
如果需要多次使用该逻辑,可以封装成自定义函数:
CREATE FUNCTION dbo.TrimTrailingNumbers(@InputString NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @ReverseString NVARCHAR(MAX) = REVERSE(@InputString) DECLARE @FirstNonDigitPos INT = PATINDEX('%[^0-9]%', @ReverseString) -- 全数字时返回原字符串,若需返回空值可改为 RETURN '' IF @FirstNonDigitPos = 0 RETURN @InputString RETURN LEFT(@InputString, LEN(@InputString) - @FirstNonDigitPos + 1) END GO -- 调用示例 SELECT dbo.TrimTrailingNumbers('abcd-1-efgh12') AS TrimmedResult
内容的提问来源于stack exchange,提问作者Lee Murray
相关产品推荐
相关产品推荐

