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

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

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

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

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

【问题讨论】:

  • +1 谢谢。也许是一个简单的概念,但非常有价值。

标签: sql sql-server tsql mysql


【解决方案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 查询中”?因为您可能必须不止一次地这样做。为什么不将该代码封装到一个模块中,而不是到处重复呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 2013-03-03
      • 1970-01-01
      相关资源
      最近更新 更多