【问题标题】:Concat rows into 1 string将行连接成 1 个字符串
【发布时间】:2017-06-24 03:46:48
【问题描述】:

我正在使用 SQL Server 2005,并希望找到一种更简单的方法将多行连接成 1 个字符串。

PK Column1, Column2
--  -------  -------
PK1 apple    orange
PK1 pear     banana
PK1 honey
PK2 apple2    orange2
PK2 pear2     banana2
PK2 honey2

结果:

PK1, apple orange pear banana honey
PK2, apple2 orange2 pear2 banana2 honey2

COALESCE 很容易使用,但在 SQL Server 2005 中不可用。我尝试了 XML Path,但它在末尾附加了额外的字符。

你能给我一些建议吗?谢谢。

【问题讨论】:

    标签: sql-server tsql sql-server-2005


    【解决方案1】:

    一个更简单的解决方案是使用XML PATH

    SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(a.Column1)
    FROM dbo.mytbl AS a WHERE a.ColumnX = somecondition
    FOR XML PATH ( '' ) , TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    
    SELECT @cols
    

    当然,WHERE 子句在您的情况下是可选的。不用勺子喂你,将同样的方法应用于你的另一列并将它们连接起来。瞧!

    【讨论】:

      【解决方案2】:

      当您的数据在for xml path 的结果中是一些空格' ' 时,您将在末尾看到 ,如'  '

      select '    ' for xml path ('');
      

      在你的情况下,我可以使用这个查询:

      select t.PK, 
          ltrim(rtrim(replace(
          (select ' ' + isnull(ti.Column1, '') + ' ' + isnull(ti.Column2, '')
           from yourTable ti 
           where ti.PK = t.PK
           for xml path (''))
           , ' ', ''))) fruits
      from yourTable t
      group by t.PK;
      

      【讨论】:

        【解决方案3】:

        这将捕获空值或空值

        Declare @YourTable table (PK int,Column1 varchar(25), Column2 varchar(25))
        Insert Into @YourTable values
        (1,'apple','orange'),
        (1,'pear','banana'),
        (1,'honey', null),
        (2,'apple2','orange2'),
        (2,'pear2','banana2'),
        (2,'honey2', null)
        
        Select PK
              ,DelimString = Stuff((Select case when Column1 is null or Column1='' then '' else ' ' + replace(Column1,char(13),'') end
                                          +case when Column2 is null or Column2='' then '' else ' ' + replace(Column2,char(13),'') end  
                                     From  @YourTable
                                     Where PK=A.PK
                                     For XML  Path('')), 1, 1, '') 
         From @YourTable A
         Group By PK
        

        返回

        PK  DelimString
        1   apple orange pear banana honey 
        2   apple2 orange2 pear2 banana2 honey2 
        

        【讨论】:

        • 谢谢约翰。出于某种原因,它使用 XML Path 将 附加到字符串的末尾。看看我如何删除它。
        • @user3015739 这是一个换行符
        • 我正在尝试根据此处描述的内容找出将 TEXT 命令放在哪里:stackoverflow.com/questions/16547175/…
        • 是的,我可以使用 REPLACE 函数将其删除。现在,我在前面需要另一列的地方添加了一些新的调整。
        • 卡佩莱蒂,你很棒。我会稍微调整一下以区分我的 PK 列。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 2013-05-15
        • 2014-04-19
        相关资源
        最近更新 更多