TSQL选择逗号列表到行

时间:2010-12-04 08:28:00

标签: tsql

如何在一行中输入逗号列表字段并将其显示在一列中?

例如,

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

为:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分:1)

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

我已经解决了这个问题,并写了一篇关于它的文章,可以在他的网址中找到。的 http://www.sqlservercentral.com/articles/Tally+Table/72993/

新方法为VARCHAR(8000)的所有While循环,递归CTE和XML方法打开了大门。

我还会告诉你,一位名叫“彼得”的人甚至对那段代码做了改进(在文章的讨论中)。这篇文章仍然很有趣,我将在接下来的一两天内用Peter的增强功能更新附件。在我的主要增强功能和彼得所做的微调之间,我不相信你会找到一个更快的T-SQL-Only解决方案来分割VARCHAR(8000)。我也解决了VARCHAR(MAX)这类分离器的问题,并且正在为此写一篇文章。