跨多行拆分可变长度分隔的字符串(SQL)

时间:2010-08-11 09:40:08

标签: sql sql-server-2005 string

我有一个表,在一列中包含一个可变长度分隔的字符串,例如:

  

20,0,5,^ 24,0,0,^ 26,0,0,^   281,0,0,^ 34,0,2 ,, ^ 48,0,2 ,, ^ 43,4,^ 20,0,10 ,, ^   20,5,5 ,, ^ 379,1,1 ,, ^ 26,1,2 ,, ^ 32,0,1,^ 71,0,2 ,, ^

我需要做的是拆分此字符串,以便在新行上返回^字符后面的每个数字。像:

  

项目编号项目代码
  项目1 20
  Item2 ^ 24
  Item3 ^ 24
  Item4 ^ 27
  Item5 ^ 28
  Item6 ^ 65
  Item7 ^ 66
  Item8 ^ 39
  Item9 ^ 379
  Item10 ^ 448
  Item11 ^ 427

我尝试了各种分割函数,我可以设法通过将多个列中的值子串到子列然后使用unpivot将它们返回到多行来实现我需要的结果,但是这个方法不会处理这个字符串的变长度

任何更好的方法的想法?

1 个答案:

答案 0 :(得分:0)

首先,我要说的是,这就是你首先在字段中没有逗号分隔数据的原因。没有简单有效的方法可以使用它。

也就是说,您可以使用递归查询来拆分字符串并从中获取数字:

with split as
(
  select
    item = cast('' as varchar(max)),
    source = cast('20,0, 5,,^24,0, 0,,^26,0, 0,,^281,0, 0,,^34,0, 2,,^48,0, 2,,^44,0, 2,,^20,0, 10,,^20,5, 5,,^379,1, 1,,^26,1, 2,,^32,0, 1,,^71,0, 2,,^' as varchar(max))
  union all
  select
    item = substring(source, 1, charindex(',,', source)),
    source = substring(source, charindex(',,', source) + 2, 10000)
  from split
  where source > ''
)
select substring(item, 1, charindex(',', item) -1)
from split
where item > ''

结果:

20
^24
^26
^281
^34
^48
^44
^20
^20
^379
^26
^32
^71