代码之家  ›  专栏  ›  技术社区  ›  JamesEggers

在单列中连接记录而不循环?

  •  4
  • JamesEggers  · 技术社区  · 17 年前

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

    最后,我想做与分割函数相反的事情。

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

    编辑: 由于在MySQL中有一个非常好的答案(与我最初预期的MS SQL相反),我决定重新标记,以便其他人也能找到答案。

    5 回复  |  直到 15 年前
        1
  •  6
  •   Nikhil S    17 年前

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

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

        2
  •  6
  •   KM.    17 年前

    试试这个:

    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
  •  1
  •   DavidStein    17 年前

    我刚刚解决了一个这样的问题,循环永远都需要。所以,我确定了表示介质中的值(在本例中是Crystal Reports),它非常快。

    只是一个想法。

        4
  •  1
  •   srini.venigalla    17 年前

    如果是mysql,可以使用group_concat

    从A表组中选择A、C组(B分隔符',');

        5
  •  1
  •   Community Mohan Dere    7 年前

    可能是现在的,但是看看 Adam Machanic's post on the topic .

    和 this one is certainly dated; I wrote it in 2004 .

    为什么我更喜欢函数而不是“将它保存在SQL查询中”?因为你可能要做不止一次。为什么不把代码封装到一个模块中,而不是在整个地方重复它呢?