2010-12-04 49 views
5

如何在行中打开逗号列表字段并将其显示在列中?TSQL选择逗号列表到行

例如,

ID | Colour 
------------ 
1 | 1,2,3,4,5 

到:

ID | Colour 
------------ 
1 | 1 
1 | 2 
1 | 3 
1 | 4 
1 | 5 
+0

和一个问题已经被问了很多次......一个这样的例子:http://stackoverflow.com/questions/4250475/split-one-column-into-multiple-rows – 2010-12-04 08:46:46

+0

@Mark Byers:这个数据库设计针对存储PHP网站等列表进行了优化。对于SQL人员来说很糟糕,但对于前端开发人员来说很方便。 – Andomar 2010-12-04 11:30:06

回答

5

通常的方法来解决,这是创建分割功能。您可以从Google抓取一个,例如this one from SQL Team。一旦你创建的函数,你可以用它喜欢:

create table colours (id int, colour varchar(255)) 
insert colours values (1,'1,2,3,4,5') 

select colours.id 
,  split.data 
from colours 
cross apply 
     dbo.Split(colours.colour, ',') as split 

此打印:

id data 
1  1 
1  2 
1  3 
1  4 
1  5 
+0

select dbo.XW_Wheels.ID,dbo.Splitter(XW_Wheels.Colours,',') from XW_Wheels cross apply dbo.Splitter(XW_Wheels.Colours,',')as split and I get this message“Can not find any列“dbo”或用户定义的函数或集合“dbo.Splitter”,或名称不明确。“ – Rya 2010-12-05 11:37:18

2

另一种可能的解决方法是使用XML(假设你使用SQL Server 2005或更高的工作):

DECLARE @s TABLE 
    (
     ID INT 
    , COLOUR VARCHAR(MAX) 
    ) 

INSERT INTO @s 
VALUES (1, '1,2,3,4,5') 

SELECT s.ID, T.Colour.value('.', 'int') AS Colour 
FROM (SELECT ID 
        , CONVERT(XML, '<row>' + REPLACE(Colour, ',', '</row><row>') + '</row>') AS Colour 
      FROM  @s a 
     ) s 
     CROSS APPLY s.Colour.nodes('row') AS T(Colour) 
1

我知道这是一个较旧的帖子,但认为我会添加更新。 Tally Table和cteTally表格分离器都有一个主要问题。他们使用连接的分隔符,当元素变宽并且字符串变长时,它们会降低速度。

我修复了这个问题,并且写了一篇关于它的文章,可以在他的URL后面找到。 http://www.sqlservercentral.com/articles/Tally+Table/72993/

新方法使VARCHAR(8000)的所有While循环,递归CTE和XML方法关闭。

我还会告诉你,一个名叫“彼得”的家伙甚至对这段代码进行了改进(在本文的讨论中)。文章仍然很有趣,我将在第二天或第二天用Peter的增强功能更新附件。在我的主要增强和彼得的tweek之间,我不相信你会发现一个更快的T-SQL-Only解决方案来分割VARCHAR(8000)。我也解决了VARCHAR(MAX)这种分离器的问题,并且正在为此写一篇文章。