2012-03-15 48 views
10

假設我們有一個簡單的查詢是這樣的:如何使用逗號之間的T-SQL結果列表?

SELECT x 
FROM t 
WHERE t.y = z 

如果我們在結果集中的一個記錄,我想變@v設置爲一個值。如果我們有兩個或更多記錄,我希望結果用逗號和空格分隔。編寫這個T-SQL代碼的最好方法是什麼?

實施例:

結果集的1結果:

​​

結果集的2個記錄:

Value1, Value2 

結果集的3個記錄:

Value1, Value2, Value3 
+0

'什麼是最好的辦法'‘最佳’是主觀的..取決於你在找什麼東西。你可以說得更詳細點嗎?它是否需要完全在T-SQL中完成,還是可以在客戶端上使用解決方案? – 2012-03-15 19:22:07

+0

這是否適用? http://stackoverflow.com/questions/1048209/concatenating-column-values-into-a-comma-separated-list – MatthewMartin 2012-03-15 19:23:21

+0

我只是想爲此寫一個泛型函數..通常我在.NET中處理這些代碼後,我已經得到了結果,但我想這樣做在SQL – MacGyver 2012-03-15 19:23:57

回答

9

這會給你一個逗號值的列表分隔列表

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

+0

+1,這個工程。如果您想刪除最後一個逗號,請執行Select LEFT(@v,Len(@v)-1) – kd7 2012-03-15 19:28:33

+0

@ kd7謝謝 - 我會編輯它,但它實際上是' - 2',因爲值是' '這是逗號+空格。 – Yuck 2012-03-15 19:29:13

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 
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,而是一個空白路徑。 子串(選擇,2個,200萬)去除領先「」

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 
相關問題