如何将列数据拆分为不同的行

时间:2011-07-25 07:05:51

标签: sql sql-server-2008

我有一个表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 

4 个答案:

答案 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)