如何在一行中输入逗号列表字段并将其显示在一列中?
例如,
ID | Colour
------------
1 | 1,2,3,4,5
为:
ID | Colour
------------
1 | 1
1 | 2
1 | 3
1 | 4
1 | 5
答案 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)这类分离器的问题,并且正在为此写一篇文章。