如何在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=就行。
验证你的示例数据
用你给的三个测试值跑这个查询,会得到你想要的结果:
| BOCodeGMI | BOCodeGMI_1 | BOCodeGMI_2 |
|---|---|---|
| e=01:c=KW:m=10000 | 01 | KW |
| c=C-:e=01:m=10000 | 01 | C- |
| c=S-:e=01:m=10000 | 01 | S- |
内容的提问来源于stack exchange,提问作者Partha
相关产品推荐
相关产品推荐

