TSQL选择逗号列表到行
如何在行中打开逗号列表字段并将其显示在列中?TSQL选择逗号列表到行
例如,
ID | Colour
------------
1 | 1,2,3,4,5
到:
ID | Colour
------------
1 | 1
1 | 2
1 | 3
1 | 4
1 | 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
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
另一种可能的解决方法是使用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)
我知道这是一个较旧的帖子,但认为我会添加更新。 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)这种分离器的问题,并且正在为此写一篇文章。
和一个问题已经被问了很多次......一个这样的例子:http://stackoverflow.com/questions/4250475/split-one-column-into-multiple-rows – 2010-12-04 08:46:46
@Mark Byers:这个数据库设计针对存储PHP网站等列表进行了优化。对于SQL人员来说很糟糕,但对于前端开发人员来说很方便。 – Andomar 2010-12-04 11:30:06