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去掉其中的-,得到1234567RIGHT(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
相关产品推荐
相关产品推荐

