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

如何在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

逻辑说明:

  1. REVERSE(SequenceId)反转字符串后,用CHARINDEX找到最后一个-的位置
  2. LEFT截取字符串中最后一个-之前的部分
  3. 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 '%-%'

逻辑说明:

  1. 用STRING_SPLIT拆分字符串为多行,通过CTE标记每段的行号和总段数
  2. 拼接前n-1段内容,再加上最后一段数字减1的结果

注意事项

  • 替换代码中的YourTableName为实际表名
  • 执行UPDATE前建议先改为SELECT语句,验证结果是否符合预期
  • 若存在格式异常的记录(如无连字符、最后一段非数字),WHERE条件可过滤此类数据,避免执行报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:29:50