我有一个表Sitetable
,其中包含多个以逗号(,)分隔的值,并希望将其拆分,以便我将每个站点放在自己的行上但前面有相同的数字。
所以我的输入数据是:
Number Site
952240 2-78,2-89
952423 2-78,2-83,8-34
我的预期输出是:
Number Site
952240 2-78
952240 2-89
952423 2-78
952423 2-83
952423 8-34
答案 0 :(得分:1)
SplitStringToTable有一个很好的例子。
答案 1 :(得分:0)
(不是你想要的答案,但正如你在评论中提到的那样......)
你需要这个“黑客”的原因是因为你的表没有规范化。如果将站点和数字之间的关系移动到自己的表中,问题就会消失:
number_table (number, ...)
site_table (site_id, site_name, ...)
assigned_site (number, site_id)
使用从asssigned_site到number_table和site_table的外键。
如果您的表格是这样构建的,那么简单的连接就可以达到您想要的效果:
SELECT nb.number, agn.site_id, sit.site_name
FROM number_table nb
JOIN assigned_site agn ON nb.number = agn.number
JOIN site sit ON sit.site_id = agn.site_id
仅当您的网站具有除实际标识符之外的其他属性时才需要site_table
(如我在site_name中的示例所示)。
如果您的网站仅包含该ID,则您不需要site_table
,并且您的问题将简化为简单SELECT * FROM assigned_site
。
答案 2 :(得分:0)
这种方式可以做你想要的。只需在下面的查询中将@T
替换为Sitetable
。
declare @T table
(
Number int,
Site varchar(20)
)
insert into @T values
(952240, '2-78,2-89'),
(952423, '2-78,2-83,8-34')
select T1.Number,
T3.I.value('.', 'varchar(5)') as Site
from @T as T1
cross apply (select cast('<i>'+replace(T1.Site, ',', '</i><i>')+'</i>' as xml)) as T2(X)
cross apply T2.X.nodes('i') as T3(I)
答案 3 :(得分:0)
此问题已在以下方面解决: SQL Server 2008 - split multi-value column into rows with unique values
在你的情况下,
With Inputs As
(
select 952240 as Number, '2-78,2-89' as [Site]
union
select 952423, '2-78,2-83,8-34'
)
, XCte As
(
Select number, Cast( '<data>' + Replace( Inputs.[Site], ',', '</data><data>' ) + '</data>' As xml ) As XValue
From Inputs
)
Select Number, Y.data.value('.','nvarchar(max)') As Site
From XCte
Cross Apply XValue.nodes('//data') Y(data)