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

如何在T-SQL中拆分SQL Server表的BOCodeGMI列生成新列?

嘿,作为SQL新手,这种字符串拆分的需求确实容易懵,我来给你写好代码,再一步步讲明白怎么回事,保证你能看懂!

完整的T-SQL查询代码

SELECT 
    Account,
    CTSFirm,
    AccountName,
    BOCodeGMI,
    -- 提取e=对应的值,生成BOCodeGMI_1
    CASE 
        WHEN CHARINDEX('e=', BOCodeGMI) > 0 THEN
            SUBSTRING(
                BOCodeGMI,
                CHARINDEX('e=', BOCodeGMI) + 2,  -- 跳过'e='这两个字符,从值的第一个字符开始
                CHARINDEX(':', BOCodeGMI, CHARINDEX('e=', BOCodeGMI)) - CHARINDEX('e=', BOCodeGMI) - 2  -- 计算值的长度
            )
        ELSE NULL  -- 如果没有'e=',返回NULL
    END AS BOCodeGMI_1,
    -- 提取c=对应的值,生成BOCodeGMI_2
    CASE 
        WHEN CHARINDEX('c=', BOCodeGMI) > 0 THEN
            SUBSTRING(
                BOCodeGMI,
                CHARINDEX('c=', BOCodeGMI) + 2,  -- 跳过'c='这两个字符
                CHARINDEX(':', BOCodeGMI, CHARINDEX('c=', BOCodeGMI)) - CHARINDEX('c=', BOCodeGMI) - 2  -- 计算值的长度
            )
        ELSE NULL  -- 如果没有'c=',返回NULL
    END AS BOCodeGMI_2
FROM StagingEDFACRRBO;

代码拆解(新手友好版)

我把每个关键函数的作用给你掰碎了讲:

  • CHARINDEX('e=', BOCodeGMI):找BOCodeGMI字符串里e=这个片段的起始位置,如果返回大于0,说明字符串里有e=。
  • SUBSTRING(字符串, 起始位置, 长度):从指定位置开始,截取指定长度的字符。这里我们跳过e=(所以起始位置是CHARINDEX('e=', ...)+2),然后找e=之后的第一个:的位置,用这个位置减去e=的起始位置再减2,就得到了e=后面值的长度。
  • CASE语句:用来判断是否存在e=/c=片段,存在就提取值,不存在就返回NULL,完全符合你的需求。

边界情况补充(可选)

如果你的数据里偶尔会出现e=或c=在字符串最后一位的情况(比如e=01:c=KW),上面的代码会因为找不到后面的:而出错,这时候可以稍微修改一下长度的计算逻辑:

-- 针对BOCodeGMI_1的修改版
CASE 
    WHEN CHARINDEX('e=', BOCodeGMI) > 0 THEN
        SUBSTRING(
            BOCodeGMI,
            CHARINDEX('e=', BOCodeGMI) + 2,
            -- 如果找到e=后面的:,就用它计算长度;如果找不到,就取到字符串末尾
            CASE 
                WHEN CHARINDEX(':', BOCodeGMI, CHARINDEX('e=', BOCodeGMI)) > 0 THEN
                    CHARINDEX(':', BOCodeGMI, CHARINDEX('e=', BOCodeGMI)) - CHARINDEX('e=', BOCodeGMI) - 2
                ELSE
                    LEN(BOCodeGMI) - CHARINDEX('e=', BOCodeGMI) - 1
            END
        )
    ELSE NULL
END AS BOCodeGMI_1

BOCodeGMI_2的修改逻辑完全一样,把所有e=换成c=就行。

验证你的示例数据

用你给的三个测试值跑这个查询,会得到你想要的结果:

BOCodeGMIBOCodeGMI_1BOCodeGMI_2
e=01:c=KW:m=1000001KW
c=C-:e=01:m=1000001C-
c=S-:e=01:m=1000001S-

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:22:14