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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:52:12