我正在尝试将字符串分成用逗号分隔的不同列。我尝试了所有关于stackoverflow的文章,但没有成功。
示例:
Column1
mouse,monitor,keyboard
cable,mouse
headset,desk,cable,monitor,usb,charger
预期结果:
Column1 |Column2 |Column3 |Column4 |Column5 |Column6
mouse |monitor |keyboard | NULL | NULL | NULL
cable |mouse |NULL | NULL | NULL | NULL
headset |desk |cable | monitor | usb | charger
请注意, Column1 下的字符串最多可以包含10个字符串,并且每周都有不同的字符串,因此它们是不确定的。
这是我尝试过的代码之一:
Declare #TblName (id int, Column1 varchar(max))
Insert into #TblName
Select A.Column1
,B.*
From #TblNameK A
Cross Apply (
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
,Pos6 = xDim.value('/x[6]','varchar(max)')
,Pos7 = xDim.value('/x[7]','varchar(max)')
,Pos8 = xDim.value('/x[8]','varchar(max)')
,Pos9 = xDim.value('/x[9]','varchar(max)')
From (Select Cast('<x>' + Replace(A.Column1,',','</x><x>')+'</x>' as XML) as xDim) A
) B
答案 0 :(得分:1)
由于使用的是SQL Server 2016,因此可以使用内置的string_split()
函数:
declare @t table (Value varchar(max));
insert into @t (Value)
values
('mouse,monitor,keyboard'),
('cable,mouse'),
('headset,desk,cable,monitor,usb,charger')
;
select *
from @t t
cross apply string_split(t.Value, ',') ss;
如果您实际上要从中获取一些汇总的统计信息,那么将所有值都放在一列中将特别方便。
答案 1 :(得分:1)
您可以在下面使用XML方法:
DECLARE
@t TABLE (keywords VARCHAR(MAX) )
INSERT INTO @t VALUES
('mouse,monitor,keyboard'),
('cable,mouse'),
('headset,desk,cable,monitor,usb,charger'),
('M&M,Hot&Cold,sneakers')
SELECT
ROW_NUMBER() OVER(ORDER BY keywords DESC) ID
, keywords
FROM (
SELECT
LTRIM(RTRIM(m.n.value('.[1]','VARCHAR(8000)'))) keywords
FROM (
SELECT CAST('<Root><Keyword>' + REPLACE(REPLACE(keywords,'&','&') ,',','</Keyword><Keyword>') + '</Keyword></Root>' AS XML) keywords
FROM @t
) D
CROSS APPLY keywords.nodes('/Root/Keyword')m(n)
) C
这会将每个关键字排成一行。从那里,您可以计算关键字的数量并对其做进一步的处理(例如获取不同的值,将它们旋转..etc)。