问题描述
我有包含财务帐户代码的字段:
I have field that contains financial account codes:
1000000-MER-MHO-GEN-------- 1000000-MER-MHO-GEN-MUS------- 1000000-MER-MHO-GEN----RUG---- 1000000-MER-MHO-GEN--------VET
我想用 - 作为分隔符将它分成 Seg01 到 Seg12 列
I would like to split it into columns Seg01 to Seg12 with - as the delimiter
前 4 个段将始终存在,然后可能存在一个或多个段.
The first 4 segments will always be there, then there after one or more segments could possibly exist.
推荐答案
这是一个使用 JSON 的快速选项.
Here's a quick option using a bit of JSON.
示例
Declare @YourTable Table ([SomeCol] varchar(50)) Insert Into @YourTable Values ('1000000-MER-MHO-GEN--------') ,('1000000-MER-MHO-GEN-MUS-------') ,('1000000-MER-MHO-GEN----RUG----') ,('1000000-MER-MHO-GEN--------VET') Select A.* ,Pos1 = JSON_VALUE(S,'$[0]') ,Pos2 = JSON_VALUE(S,'$[1]') ,Pos3 = JSON_VALUE(S,'$[2]') ,Pos4 = JSON_VALUE(S,'$[3]') ,Pos5 = JSON_VALUE(S,'$[4]') ,Pos6 = JSON_VALUE(S,'$[5]') ,Pos7 = JSON_VALUE(S,'$[6]') ,Pos8 = JSON_VALUE(S,'$[7]') ,Pos9 = JSON_VALUE(S,'$[8]') ,Pos10 = JSON_VALUE(S,'$[9]') ,Pos11 = JSON_VALUE(S,'$[10]') ,Pos12 = JSON_VALUE(S,'$[11]') From @YourTable A Cross Apply ( values ( '["'+replace(SomeCol,'-','","')+'"]' ) ) B(S)
结果
以防万一<2016 ...这是一种XML方法
Select A.* ,Pos1 = xDim.value('/x[1]' ,'varchar(100)') -- Select the appropriate data type ,Pos2 = xDim.value('/x[2]' ,'varchar(100)') ,Pos3 = xDim.value('/x[3]' ,'varchar(100)') ,Pos4 = xDim.value('/x[4]' ,'varchar(100)') ,Pos5 = xDim.value('/x[5]' ,'varchar(100)') ,Pos6 = xDim.value('/x[6]' ,'varchar(100)') ,Pos7 = xDim.value('/x[7]' ,'varchar(100)') ,Pos8 = xDim.value('/x[8]' ,'varchar(100)') ,Pos9 = xDim.value('/x[9]' ,'varchar(100)') ,Pos10= xDim.value('/x[10]','varchar(100)') ,Pos11= xDim.value('/x[11]','varchar(100)') ,Pos12= xDim.value('/x[12]','varchar(100)') From @YourTable A Cross Apply ( values (convert(xml,'<x>' + replace(A.SomeCol,'-','</x><x>')+'</x>')) )B(xDim)