在没有循环的情况下在单个列中连接记录?

时间:2009-10-19 21:46:14

标签: sql sql-server tsql mysql

我有一个包含1列varchar值的表。如果可能的话,我正在寻找一种方法将这些值连接成一个没有循环的值。如果一个循环是解决这个问题的最有效方法,那么我将采用这种方式,但我想在默认为该方法之前我会要求其他选项。我还想将其保留在SQL查询中。

最终,我想做一个分裂功能的反面。

是否可以不使用循环(或游标),或者我应该使用循环来实现这一点?

编辑: 由于有一个非常好的答案与如何在MySql中进行相关(与我最初想要的MS Sql相对),我决定重新录制,以便其他人也可以找到答案。

5 个答案:

答案 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;