如何在SQL Server中基于最后两个连字符从右侧拆分字符串?
解决SQL Server中从右侧按连字符拆分字符串到多列的问题
针对你的需求——从右侧起用连字符分隔字符串,把最后两段分别放入Column2、Column3,剩余部分合并为Column1,这里提供两种实用解法:
方法一:直接通过字符位置计算(高效单字符串处理)
不需要拆分再聚合,直接通过反转字符串定位连字符位置,一步到位:
DECLARE @str VARCHAR(MAX) = 'CCP-GX-NP-ICL-14-SDSFPD4_04-MUN0X3' -- 获取最后一个连字符在原字符串中的位置 DECLARE @lastDashPos INT = LEN(@str) - CHARINDEX('-', REVERSE(@str)) + 1 -- 获取倒数第二个连字符在原字符串中的位置 DECLARE @secondLastDashPos INT = LEN(LEFT(@str, @lastDashPos - 1)) - CHARINDEX('-', REVERSE(LEFT(@str, @lastDashPos - 1))) + 1 SELECT LEFT(@str, @secondLastDashPos - 1) AS [Column 1], SUBSTRING(@str, @secondLastDashPos + 1, @lastDashPos - @secondLastDashPos - 1) AS [Column 2], RIGHT(@str, LEN(@str) - @lastDashPos) AS [Column 3]
逻辑说明:
- 先通过反转字符串找到最后一个
-的位置,直接截取最后一段作为Column3 - 对最后一段之前的子串重复反转操作,找到倒数第二个
-的位置,截取中间段作为Column2 - 剩余的开头部分直接作为Column1
方法二:基于STRING_SPLIT的聚合处理(适合批量多行数据)
如果要处理多行数据,拆分后聚合的方式更灵活,基于你已有的拆分代码优化:
DECLARE @str VARCHAR(MAX) = 'CCP-GX-NP-ICL-14-SDSFPD4_04-MUN0X3' WITH SplitCTE AS ( SELECT value, -- 标记每个拆分部分的从左到右序号 ROW_NUMBER() OVER (ORDER BY CHARINDEX('-' + value + '-', '-' + @str + '-')) AS rn, -- 统计总共有多少个拆分部分 COUNT(*) OVER () AS total_parts FROM STRING_SPLIT(@str, '-') ) SELECT -- 合并前total_parts-2个部分 STRING_AGG(CASE WHEN rn <= total_parts - 2 THEN value END, '-') AS [Column 1], -- 取倒数第二个部分 MAX(CASE WHEN rn = total_parts - 1 THEN value END) AS [Column 2], -- 取最后一个部分 MAX(CASE WHEN rn = total_parts THEN value END) AS [Column 3] FROM SplitCTE
逻辑说明:
- 先拆分字符串并标记每个部分的序号,同时统计总段数
- 用
STRING_AGG合并前总段数-2个部分,得到Column1 - 用条件判断分别提取倒数第二段(Column2)和最后一段(Column3)
两种方法都能得到你想要的输出结果,可根据实际场景(单条/批量数据)选择。
内容的提问来源于stack exchange,提问作者Ash Atre
相关产品推荐
相关产品推荐

