假设我们有一个像这样的简单查询:
SELECT x
FROM t
WHERE t.y = z
如果我们在结果集中有一条记录,我想将变量@v
设置为该值。如果我们有两个或更多记录,我希望结果用逗号和空格分隔。编写此T-SQL代码的最佳方法是什么?
示例:
1条记录的结果集:
Value1
2条记录的结果集:
Value1, Value2
3条记录的结果集:
Value1, Value2, Value3
答案 0 :(得分:10)
这将为您提供逗号分隔列表中的值列表
create table #temp
(
y int,
x varchar(10)
)
insert into #temp values (1, 'value 1')
insert into #temp values (1, 'value 2')
insert into #temp values (1, 'value 3')
insert into #temp values (1, 'value 4')
DECLARE @listStr varchar(255)
SELECT @listStr = COALESCE(@listStr+', ', '') + x
FROM #temp
WHERE #temp.y = 1
SELECT @listStr as List
drop table #temp
答案 1 :(得分:9)
您可以使用XML来执行此操作:
DECLARE @V VarChar(4000);
SELECT @V = CONVERT(VarChar(4000), (
SELECT x + ', '
FROM t
WHERE t.y = z
FOR XML PATH('')
));
-- To remove the final , in the list:
SELECT @V = LEFT(@V, LEN(@V) - 2);
SELECT @V;
对于其他选项,请查看Concatenating Row Values in SQL。
答案 2 :(得分:3)
由于它是SQL Server 2008,您可以使用FOR XML:
SELECT SUBSTRING(
(SELECT ',' + t.x
FROM t
WHERE t.y = z
FOR XML PATH('')),
2,
200000) AS CSV
FOR XML PATH('')选择表作为XML,但使用空白路径。 SUBSTRING(选择,2,2000000)删除前导','
答案 3 :(得分:1)
这样的事情怎么样?
DECLARE @x AS VARCHAR(2000)
SET @x = ''
SELECT @x = @x + RTRIM(x) + ','
FROM t
SELECT @x = SUBSTRING(@x, 1, LEN(@x) - 1)
PRINT @x
答案 4 :(得分:1)
您可以使用递归CTE:
CREATE TABLE #TableWithId (Id INT IDENTITY(1,1), x VARCHAR)
INSERT INTO #TableWithId
SELECT x
FROM t
WHERE t.y = z
WITH Commas(ID, Flattened)
AS
(
-- Anchor member definition
SELECT ID, x AS Flattened
FROM #TableWithId
WHERE ID = 1
UNION ALL
-- Recursive member definition
SELECT #TableWithId.Id, Flattened + ',' + x
FROM #TableWithId
INNER JOIN Commas
ON #TableWithId.Id + 1 = Commas.Id
)
-- Statement that executes the CTE
SELECT TOP 1 Flattened
FROM Commas
ORDER BY id;
GO