2009-10-19 84 views
4

我有一列有1列varchar值的表。如果可能的话,我正在寻找一种方法将这些值连接成一个没有循环的单个值。如果一个循环是最有效的方法,那么我会这样做,但我认为在默认该方法之前我会要求其他选项。我也想保留在SQL查询中。在没有循环的单个列中连接记录?

最终,我想做一个分裂函数的反义词。

是否有可能没有循环(或光标),或者我应该使用循环来实现这种情况?

编辑: 由于在MySql中如何做到这一点非常好(与MS Sql相反,就像我最初打算的那样),我决定重新编写代码,以便其他人也能够找到答案。

+0

+1感谢。也许一个简单的概念,但非常有价值。 – madcolor 2009-10-23 13:27:21

回答

6

申报@concat VARCHAR(最大) 组@concat = ''

选择@concat = @concat + COL1 + ' 从tablename1

+3

使用此方法时,您无法使用订单。你可以使用FOR XML PATH,就像我的答案一样。然而,FOR XML PATH适用于SQL Server 2005并且最多可以使用 – 2009-10-20 15:28:52

+0

@KM谢天谢地,在我的情况下,我不需要order by子句;然而,知道这很好。 – JamesEggers 2009-10-20 16:20:29

+0

@KM。如果您确实需要ORDER BY子句,则可以选择TOP 100%,并且SQL Server将允许它。 – Curt 2015-05-28 17:06:58

1

,' 我刚解决的问题像这样和循环永远占据。因此,我将演示媒体中的值(在这种情况下是Crystal Reports)的数值放在一起,速度非常快。

只是一个想法。

+0

不幸的是,我正在编写的脚本是纯数据操作来纠正一些不良数据。如果是UI相关的话,我会同意这样做会是更好的选择。 – JamesEggers 2009-10-19 22:00:23

1

如果是MySQL,你可以使用GROUP_CONCAT

选择一个,GROUP_CONCAT(B分离器 '')FROM表GROUP BY A;

+0

供参考:有些人会因为提供一个不相关的答案而让你失望。 – 2009-10-20 00:43:22

+0

当我在寻找MS Sql的时候,我仍然会赞成它,因为别人也可能会询问这个问题。 – JamesEggers 2009-10-20 01:09:23

+0

但是当它被标记为sql,sql-server和tsql时,他们不会去发现它...... – 2009-10-20 01:36:40

5

试试这个:

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)