Concat行成1个字符串

时间:2017-02-07 02:34:11

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

我正在使用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,但它会在最后添加其他字符。

你可以给我一些建议吗?感谢。

3 个答案:

答案 0 :(得分: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子句在您的情况下是可选的。如果没有勺子喂你,将它们应用到你的另一列并连接它们。瞧!

答案 1 :(得分:0)

这将捕获空值或空值

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 

答案 2 :(得分:0)

如果您的数据是' '结果中的某些空格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;