2017-02-07 25 views
0

我正在使用SQL Server 2005,并希望找到一种更简单的方法将多个行连接成1个字符串。Concat成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路径,但它附加了额外的字符到最后。

您能否给我提供一些建议?谢谢。

回答

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 
+0

谢谢约翰。出于某种原因,使用XML路径,它会在字符串的末尾添加&#x0D。将会看到我如何删除它。 – user3015739

+0

@ user3015739这是一个换行 –

+0

我想弄清楚在哪里把TEXT命令按照这里描述的内容:http://stackoverflow.com/questions/16547175/sql-stuff-and-for-xml-path-生成奇怪的符号 – user3015739

0

一个更容易解决方案是使用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子句是可选的在你的案件。如果没有勺子喂食,将其应用于另一列并连接它们。瞧!

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;