我有一张表,其中包含一列以可变长度定界的字符串,例如:
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,^
我需要做的是拆分此字符串,以便^字符后的每个数字都返回到新行。喜欢:
Item Number Item Code Item1 20 Item2 ^24 Item3 ^24 Item4 ^27 Item5 ^28 Item6 ^65 Item7 ^66 Item8 ^39 Item9 ^379 Item10 ^448 Item11 ^427
我已经尝试了各种分割函数,并且可以通过在多个列中对值进行子字符串化,然后使用unpivot在多个行中返回它们来设法获得所需的结果,但是此方法不能处理此字符串的可变长度。
有更好的方法的想法吗?
首先,让我说,这就是您首先不应该在字段中使用逗号分隔数据的原因。没有简单或有效的方法来使用它。
也就是说,您可以使用递归查询来拆分字符串并从中获取数字:
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