Объединение полей из нескольких строк в один столбец в T-SQL - PullRequest
2 голосов
/ 19 января 2011

Я пишу SQL-запрос, в котором мне потребуется выполнить дополнительный выбор таблицы, который обычно возвращает несколько строк. Мне нужно иметь возможность объединить результаты определенного поля из всех строк в одно поле для вывода. Возможно ли это и как?

Например, если запрос SQL возвращает

id | field
1  | test1
2  | test2
3  | test3

Мне нужно, чтобы выводимое поле было «test1 test2 test3». Спасибо

Ответы [ 5 ]

5 голосов
/ 19 января 2011

Вот трюк for xml, чтобы сделать это:

    SELECT  field + ' ' as [text()]
    FROM    YourTable
    FOR XML PATH ('')

Это печатает:

test1 test2 test3

Обычно оно используется с outer apply, чтобы выполнить его один раз для каждой строки.

3 голосов
/ 19 января 2011
declare @sample table(id int, field varchar(20))
insert into @sample values(1,'test1')
insert into @sample values(2,'test2')
insert into @sample values(3,'test3')
declare @result varchar(max) set @result = ''
select @result = @result + ' '+field from @sample
select @result

Пользовательский агрегатор SQLCLR будет альтернативным (читайте лучше) решением

0 голосов
/ 29 декабря 2014

Как дополнение к существующим ответам. Попробуйте включить выражение COALESCE с именем столбца, который вы собираетесь использовать. Это позволяет избежать нулевых значений в вашей объединенной строке и избежать того, чтобы ваш список выглядел следующим образом. Обратите внимание на лишний пробел.

field1 field2   field4 field

Более подробную информацию можно найти здесь .

GO

DECLARE @tableName VARCHAR(MAX)
SELECT  @tableName = COALESCE(@tableName + ' ' ,'') + Name
FROM    sys.tables
SELECT  @tableName

GO
0 голосов
/ 19 января 2011

Попробуйте это:

SELECT RTRIM(field)
  FROM (
                SELECT field + ' ' field
                    FROM <YOUR_TABLE>
                    FOR XML PATH('')
             ) a
0 голосов
/ 19 января 2011

это можно сделать с помощью курсора.

declare @field nvarchar(max)
declare @concat nvarchar(max)
set @concat = ''
declare @cursor cursor
set @cursor = cursor for select field from table
open @cursor
fetch next from @cursor into @field
while @@fetch_status = 0
begin
  set @concat = concat(@concat,@field)
  fetch next from @cursor into @field
end

Ваше упражнение - добавить пробел между сцепленными строками: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...