我正在编写一个SQL查询,其中我需要在表上执行子选择,这通常会返回多行。我需要能够将所有行中某个字段的结果连接到一个字段中才能输出。这有可能,怎么样?
例如,如果SQL查询返回
id | field
1 | test1
2 | test2
3 | test3
我需要输出的字段为“test1 test2 test3”。 感谢
答案 0 :(得分:5)
这是执行此操作的for xml
技巧:
SELECT field + ' ' as [text()]
FROM YourTable
FOR XML PATH ('')
打印:
test1 test2 test3
它通常与outer apply
一起使用,每行执行一次。
答案 1 :(得分:3)
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自定义聚合器将是一种替代(更好的读取)解决方案
答案 2 :(得分:0)
试试这个:
SELECT RTRIM(field)
FROM (
SELECT field + ' ' field
FROM <YOUR_TABLE>
FOR XML PATH('')
) a
答案 3 :(得分:0)
作为现有答案的补充。尝试将COALESCE表达式包含在您要使用的列名称中。这样可以避免在连接字符串中使用空值,并避免列表看起来像这样。注意多余的空白区域。
field1 field2 field4 field
可以找到更多详细信息here。
GO
DECLARE @tableName VARCHAR(MAX)
SELECT @tableName = COALESCE(@tableName + ' ' ,'') + Name
FROM sys.tables
SELECT @tableName
GO
答案 4 :(得分:-1)
可以使用光标。
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
你的练习是在连接的字符串之间添加空格: - )