在不循环的情况下连接单列中的记录?

Posted

技术标签:

【中文标题】在不循环的情况下连接单列中的记录?【英文标题】:Concatenating records in a single column without looping? 【发布时间】:2010-12-08 03:49:25 【问题描述】:

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

最终,我想做与拆分功能相反的事情。

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

编辑: 由于在 mysql 中有一个很好的答案(与我最初打算的 MS Sql 不同),因此我决定重新标记,以便其他人也能找到答案。

【问题讨论】:

+1 谢谢。也许是一个简单的概念,但非常有价值。 【参考方案1】:

声明@concat varchar(max) 设置@concat = ''

选择@concat = @concat + col1 + ',' 从表名1

【讨论】:

使用此方法时不能使用order by。您可以使用 FOR XML PATH,就像我的回答一样。但是 FOR XML PATH 适用于 SQL Server 2005 及更高版本 @KM 谢天谢地,在我的情况下,我不需要 order by 子句;但是,很高兴知道。 @KM。如果确实需要 ORDER BY 子句,可以选择 TOP 100%,SQL Server 将允许它。 @curt,我在我的 SQL Server 2012 上尝试了这个 (ORDER BY ...),我不需要 TOP 100%,它可以工作。所以,自从我在 2009 年发表评论以来,一定发生了一些变化……【参考方案2】:

试试这个:

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)

【讨论】:

【参考方案3】:

我刚刚解决了一个这样的问题,并且循环播放了很长时间。因此,我在演示媒体(在本例中为 Crystal Reports)中连接了这些值,而且速度非常快。

只是一个想法。

【讨论】:

可悲的是,我正在编写的脚本是纯粹的数据操作,以纠正一些不良数据。如果它与 UI 相关,我会同意这将是处理此类问题的更好选择。【参考方案4】:

如果是MySQL,可以使用GROUP_CONCAT

SELECT a, GROUP_CONCAT(b SEPARATOR ',') FROM table GROUP BY a;

【讨论】:

仅供参考:有些人会因为您提供的答案不相关而对您投反对票。 当我在寻找 MS Sql 时,我仍然会支持它,因为其他人也可能会询问这个问题。 @Aaron Bertrand 够公平的。用关于这个答案的注释编辑了问题,并重新标记为包括 mysql。【参考方案5】:

现在可能已经过时了,但请查看Adam Machanic's post on the topic。

还有this one is certainly dated; I wrote it in 2004。

为什么我更喜欢函数而不是“将它保存在 SQL 查询中”?因为您可能必须不止一次地这样做。为什么不将该代码封装到一个模块中,而不是到处重复呢?

【讨论】:

以上是关于在不循环的情况下连接单列中的记录?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不使用游标的情况下循环遍历 SQL 中的表变量?

如何在不中断 tkinter 主循环的情况下运行一个函数,同时将该函数的信息发送到我的主循环中的小部件?

如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较

在不循环 c++ 的情况下对 2D 数组进行分区

是否可以在不循环的情况下为 iSeries 表中的每一行生成唯一的数值?

在不循环的情况下将值更新到数据集中列中的整行