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

SQL实现含多连字符的单列拆分:合并中间字符至指定列

解决方案

你的PO字段是三段数字通过-分隔的格式,要实现将前两段合并为无分隔的Customer PO、第三段作为CustShippingOrder,核心是定位到第二个-的位置,再分别处理前后内容:

基础版SQL代码(假设所有PO都有两个-)

SELECT
    -- 提取第二个'-'之前的内容,替换所有'-'得到合并后的Customer PO
    REPLACE(LEFT(PO, CHARINDEX('-', PO, CHARINDEX('-', PO) + 1) - 1), '-', '') AS [Customer PO],
    -- 提取第二个'-'之后的内容作为CustShippingOrder
    RIGHT(PO, LEN(PO) - CHARINDEX('-', PO, CHARINDEX('-', PO) + 1)) AS [CustShippingOrder]
FROM
    你的表名;

代码解释

  • CHARINDEX('-', PO, CHARINDEX('-', PO) + 1):先找到第一个-的位置,再从该位置的下一位开始查找第二个-的位置
  • LEFT(PO, ... -1):截取到第二个-之前的所有字符(比如123456-7),再用REPLACE去掉其中的-,得到1234567
  • RIGHT(PO, LEN(PO) - ...):截取第二个-之后的所有字符,直接得到89101112

兼容边界情况的版本(处理PO无-或只有一个-的场景)

如果存在格式不统一的PO数据,可以用CASE语句做兼容处理:

SELECT
    CASE
        -- 存在两个'-'的标准格式
        WHEN CHARINDEX('-', PO, CHARINDEX('-', PO) + 1) > 0 THEN
            REPLACE(LEFT(PO, CHARINDEX('-', PO, CHARINDEX('-', PO) + 1) - 1), '-', '')
        -- 只有一个'-'的情况:合并两段作为Customer PO,后半段作为ShippingOrder
        WHEN CHARINDEX('-', PO) > 0 THEN
            REPLACE(PO, '-', '')
        -- 无'-'的情况:全部作为Customer PO,ShippingOrder为空
        ELSE PO
    END AS [Customer PO],
    CASE
        WHEN CHARINDEX('-', PO, CHARINDEX('-', PO) + 1) > 0 THEN
            RIGHT(PO, LEN(PO) - CHARINDEX('-', PO, CHARINDEX('-', PO) + 1))
        WHEN CHARINDEX('-', PO) > 0 THEN
            RIGHT(PO, LEN(PO) - CHARINDEX('-', PO))
        ELSE NULL
    END AS [CustShippingOrder]
FROM
    你的表名;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:00:17