0

我正在尝试将单行数据分成多列,并且我有一个管道 | 在我想分开的每个数据之间。

我希望将这一行数据拆分为多列

1234 |abcd | 123abc | some | more | 0922

像这样

col1   col2  col3     col4   col5    col6
1234   abcd  123abc   some   more    0922 


select 

[Col1] = SUBSTRING(PostData,1,CHARINDEX('|',PostData)-1) --does what it suppose to
,[Col1] = SUBSTRING(PostData,CHARINDEX('|',PostData)+1,CHARINDEX('|',PostData,CHARINDEX('|',PostData)+1)-CHARINDEX('|', PostData)-1) --does what it suppose to

,[Col1] = SUBSTRING(PostData,CHARINDEX('|',PostData,CHARINDEX('|',PostData)+1)-CHARINDEX('|',   PostData)-1,CHARINDEX('|',PostData,CHARINDEX('|',PostData)+1)-CHARINDEX('|',    PostData)-1) --i need help with this


,[Col1] = SUBSTRING(PostData,CHARINDEX('|',PostData)+1,CHARINDEX('|',PostData,CHARINDEX('|',PostData)+1)-CHARINDEX('|', PostData)-1)--i need help with this
,[Col1] = SUBSTRING(PostData,CHARINDEX('|',PostData)+1,CHARINDEX('|',PostData,CHARINDEX('|',PostData)+1)-CHARINDEX('|', PostData)-1)--i need help with this
,[Col1] = SUBSTRING(PostData,CHARINDEX('|',PostData)+1,CHARINDEX('|',PostData,CHARINDEX('|',PostData)+1)-CHARINDEX('|', PostData)-1) --i need help with this

,[ID]   = REVERSE(SUBSTRING(reverse(PostData),0,CHARINDEX('|',REVERSE(PostData) --does what 

它假设

从表名

col1   col2  col3     col4   col5    col6
1234   abcd  123abc   some   more    0922 

我得到的是:

col1   col2  col3   col4    col5    col6
1234   abcd  abcd   abcd     abcd    0922
4

1 回答 1

0

一种方法使用递归 CTE:

with cte as (
      select convert(varchar(max), left(row, charindex('|', row + '|') - 1)) as val,
             convert(varchar(max), stuff(row, 1, charindex('|', row) + 1, '')) as rest,
             1 as lev, row
      from (values ('1234 |abcd | 123abc | some | more | 0922')) v(row)
      union all
      select convert(varchar(max), left(rest, charindex('|', rest + '|') - 1)) as val,
             convert(varchar(max), stuff(rest, 1, charindex('|', rest + '|') + 1, '')) as rest,
             lev + 1 as lev, row
      from cte
      where lev < 5 and rest <> ''
     )
select max(case when lev = 1 then val end) as col1,
       max(case when lev = 2 then val end) as col2,
       max(case when lev = 3 then val end) as col3,
       max(case when lev = 4 then val end) as col4,
       max(case when lev = 5 then val end) as col5
from cte
group by row;

是一个 db<>fiddle。

于 2019-07-17T14:30:45.757 回答