TSQL选择逗号列表以显示行
如何在行中转换逗号列表字段并在列中显示它 比如说,TSQL选择逗号列表以显示行,tsql,Tsql,如何在行中转换逗号列表字段并在列中显示它 比如说, ID | Colour ------------ 1 | 1,2,3,4,5 致: 解决这个问题的通常方法是创建一个拆分函数。例如,你可以从谷歌(Google)抓到一个。创建函数后,您可以像这样使用它: create table colours (id int, colour varchar(255)) insert colours values (1,'1,2,3,4,5') select colours.id , spl
ID | Colour
------------
1 | 1,2,3,4,5
致:
解决这个问题的通常方法是创建一个拆分函数。例如,你可以从谷歌(Google)抓到一个。创建函数后,您可以像这样使用它:
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
另一种可能的解决方法是使用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)
我知道这是一篇比较老的帖子,但我想我应该添加一个更新。理货表和基于cteTally表的拆分器都有一个主要问题。它们使用连接的分隔符,当元素变宽,字符串变长时,这会降低它们的速度 我已经解决了这个问题,并写了一篇关于它的文章,可以在下面的URL上找到 新方法为VARCHAR8000关闭了所有While循环、递归CTE和XML方法的大门
我还要告诉你,在本文的讨论中,一个名叫Peter的家伙甚至对代码做了改进。这篇文章仍然很有趣,我将在接下来的一两天用Peter的增强功能更新附件。在我的主要增强功能和tweek Peter制作的产品之间,我不相信您会找到一个更快的仅用于拆分VARCHAR8000的t-SQL解决方案。我还为VARCHARMAX解决了这类拆分器的问题,我正在为此写一篇文章。还有一个以前被问过很多次的问题。。。一个这样的例子:@markbyers:这个数据库设计是为存储类似PHP网站的列表而优化的。这对SQL人员来说很糟糕,但对前端开发人员来说很方便。选择dbo.XW_Wheels.ID,dbo.SplitterXW_Wheels.colors,,“从XW_Wheels交叉应用dbo.SplitterXW_Wheels.colors,”,“as split AND I GET此消息找不到列dbo或用户定义函数或聚合dbo.Splitter,或名称不明确。请选择dbo.XW_Wheels.ID,从XW_Wheels分割交叉应用dbo.SplitterXW_Wheels.colors,”,'作为split,我得到的列名'split'无效。函数dbo.split返回一个表。尝试选择split.data,而不是仅仅选择split。@Rya:听起来您使用的剥离函数与SQL团队的剥离函数不同。使用select*查看返回的列名。啊,快照。价值split.value。谢谢你,安多玛,我可以吻你。。。但我不会:更好的是:选择T.name.value'.',选择CONVERTXML中的'nvarchar4000'作为颜色,+REPLACEname',',','选择'1,2,3,4,5'中的+作为名称交叉应用s.name.nodes'row'作为Tname
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)