2017-02-07 3 views
0

Я использую SQL Server 2005 и хотел бы найти более простой способ конкатенировать несколько строк в 1 строку.Конкат строк в 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, но он добавляет дополнительный символ конца.

Не могли бы вы предложить мне какое-нибудь предложение? Благодарю.

ответ

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 Это строка feed –

+0

Я пытаюсь выяснить, где положить команду TEXT в описание, описанное здесь: http://stackoverflow.com/questions/16547175/sql-stuff-and-for-xml-path- generate-strange-symbols – 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 

Конечно, где положение не является обязательным в вашем дело. И без ложки, подающего вас, примените то же самое к своей другой колонке и соедините их. Вуаля!

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^