如何在SQL Server中对分隔字符串的最后一段数字减1
SQL Server中修改连字符分隔字符串最后一段数字的实现方案
方法一:字符串函数组合(兼容多数SQL Server版本)
通过字符串定位和截取操作,直接处理目标字符串,无需拆分:
UPDATE YourTableName SET SequenceId = CONCAT( LEFT(SequenceId, LEN(SequenceId) - CHARINDEX('-', REVERSE(SequenceId))), '-', CAST(RIGHT(SequenceId, CHARINDEX('-', REVERSE(SequenceId)) - 1) AS INT) - 1 ) -- 可选:过滤有效格式的记录,避免非目标数据报错 WHERE SequenceId LIKE '%-%' AND ISNUMERIC(RIGHT(SequenceId, CHARINDEX('-', REVERSE(SequenceId)) - 1)) = 1
逻辑说明:
REVERSE(SequenceId)反转字符串后,用CHARINDEX找到最后一个-的位置LEFT截取字符串中最后一个-之前的部分RIGHT提取最后一段数字,转成整数减1后,和前面的部分拼接
方法二:使用STRING_SPLIT(SQL Server 2016及以上版本)
适合需要更灵活处理多段字符串的场景,先拆分再重组:
WITH SplitCTE AS ( SELECT SequenceId, value, ROW_NUMBER() OVER (PARTITION BY SequenceId ORDER BY (SELECT NULL)) AS rn, COUNT(*) OVER (PARTITION BY SequenceId) AS total_segments FROM YourTableName CROSS APPLY STRING_SPLIT(SequenceId, '-') ) UPDATE t SET SequenceId = STUFF( (SELECT '-' + value FROM SplitCTE sc WHERE sc.SequenceId = t.SequenceId AND sc.rn < sc.total_segments FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + '-' + CAST((SELECT CAST(value AS INT) -1 FROM SplitCTE sc WHERE sc.SequenceId = t.SequenceId AND sc.rn = sc.total_segments) AS NVARCHAR(10)) FROM YourTableName t WHERE t.SequenceId LIKE '%-%'
逻辑说明:
- 用
STRING_SPLIT拆分字符串为多行,通过CTE标记每段的行号和总段数 - 拼接前
n-1段内容,再加上最后一段数字减1的结果
注意事项
- 替换代码中的
YourTableName为实际表名 - 执行UPDATE前建议先改为SELECT语句,验证结果是否符合预期
- 若存在格式异常的记录(如无连字符、最后一段非数字),WHERE条件可过滤此类数据,避免执行报错
内容的提问来源于stack exchange,提问作者SQLDeveloper1970
相关产品推荐
相关产品推荐

