我有一列有1列varchar值的表。如果可能的话,我正在寻找一种方法将这些值连接成一个没有循环的单个值。如果一个循环是最有效的方法,那么我会这样做,但我认为在默认该方法之前我会要求其他选项。我也想保留在SQL查询中。在没有循环的单个列中连接记录?
最终,我想做一个分裂函数的反义词。
是否有可能没有循环(或光标),或者我应该使用循环来实现这种情况?
编辑: 由于在MySql中如何做到这一点非常好(与MS Sql相反,就像我最初打算的那样),我决定重新编写代码,以便其他人也能够找到答案。
我有一列有1列varchar值的表。如果可能的话,我正在寻找一种方法将这些值连接成一个没有循环的单个值。如果一个循环是最有效的方法,那么我会这样做,但我认为在默认该方法之前我会要求其他选项。我也想保留在SQL查询中。在没有循环的单个列中连接记录?
最终,我想做一个分裂函数的反义词。
是否有可能没有循环(或光标),或者我应该使用循环来实现这种情况?
编辑: 由于在MySql中如何做到这一点非常好(与MS Sql相反,就像我最初打算的那样),我决定重新编写代码,以便其他人也能够找到答案。
申报@concat VARCHAR(最大) 组@concat = ''
选择@concat = @concat + COL1 + ' 从tablename1
使用此方法时,您无法使用订单。你可以使用FOR XML PATH,就像我的答案一样。然而,FOR XML PATH适用于SQL Server 2005并且最多可以使用 – 2009-10-20 15:28:52
@KM谢天谢地,在我的情况下,我不需要order by子句;然而,知道这很好。 – JamesEggers 2009-10-20 16:20:29
@KM。如果您确实需要ORDER BY子句,则可以选择TOP 100%,并且SQL Server将允许它。 – Curt 2015-05-28 17:06:58
,' 我刚解决的问题像这样和循环永远占据。因此,我将演示媒体中的值(在这种情况下是Crystal Reports)的数值放在一起,速度非常快。
只是一个想法。
不幸的是,我正在编写的脚本是纯数据操作来纠正一些不良数据。如果是UI相关的话,我会同意这样做会是更好的选择。 – JamesEggers 2009-10-19 22:00:23
现在大概是过期了,但退房Adam Machanic's post on the topic。
和this one is certainly dated; I wrote it in 2004。
为什么我比较喜欢“保存在SQL查询中”的函数?因为你可能不得不这样做一次以上。为什么不把代码封装到单个模块中,而不是在整个地方重复使用?
如果是MySQL,你可以使用GROUP_CONCAT
选择一个,GROUP_CONCAT(B分离器 '')FROM表GROUP BY A;
供参考:有些人会因为提供一个不相关的答案而让你失望。 – 2009-10-20 00:43:22
当我在寻找MS Sql的时候,我仍然会赞成它,因为别人也可能会询问这个问题。 – JamesEggers 2009-10-20 01:09:23
但是当它被标记为sql,sql-server和tsql时,他们不会去发现它...... – 2009-10-20 01:36:40
试试这个:
DECLARE @YourTable table (Col1 int)
INSERT INTO @YourTable VALUES (1)
INSERT INTO @YourTable VALUES (2)
INSERT INTO @YourTable VALUES (30)
INSERT INTO @YourTable VALUES (400)
INSERT INTO @YourTable VALUES (12)
INSERT INTO @YourTable VALUES (46454)
SELECT
STUFF(
(
SELECT
', ' + cast(Col1 as varchar(30))
FROM @YourTable
WHERE Col1<=400
ORDER BY Col1
FOR XML PATH('')
), 1, 2, ''
)
OUTPUT:
-------------------
1, 2, 12, 30, 400
(1 row(s) affected)
+1感谢。也许一个简单的概念,但非常有价值。 – madcolor 2009-10-23 13:27:21