我有一个包含1列varchar值的表。如果可能的话,我正在寻找一种方法将这些值连接成一个没有循环的值。如果一个循环是解决这个问题的最有效方法,那么我将采用这种方式,但我想在默认为该方法之前我会要求其他选项。我还想将其保留在SQL查询中。
最终,我想做一个分裂功能的反面。
是否可以不使用循环(或游标),或者我应该使用循环来实现这一点?
编辑: 由于有一个非常好的答案与如何在MySql中进行相关(与我最初想要的MS Sql相对),我决定重新录制,以便其他人也可以找到答案。
答案 0 :(得分:6)
声明@concat varchar(max) 设置@concat =''
选择@concat = @concat + col1 +',' 来自tablename1
答案 1 :(得分:6)
试试这个:
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, ''
)
输出:
-------------------
1, 2, 12, 30, 400
(1 row(s) affected)
答案 2 :(得分:1)
我刚刚解决了这样的问题并且循环工作永远。因此,我在表示媒体(在本例中为Crystal Reports)中对这些值进行了汇总,并且速度非常快。
只是一个想法。
答案 3 :(得分:1)
可能已过时,但请查看Adam Machanic's post on the topic。
this one is certainly dated; I wrote it in 2004。
为什么我更喜欢将函数“保留在SQL查询中”?因为你可能不得不多次这样做。为什么不将该代码封装到单个模块中而不是在整个地方重复它?
答案 4 :(得分:1)
如果是MySQL,您可以使用GROUP_CONCAT
SELECT a,GROUP_CONCAT(b SEPARATOR',')FROM FROM GROUP BY a;