Как составить список результатов T-SQL с запятыми между ними? - PullRequest
11 голосов
/ 15 марта 2012

Предположим, у нас есть простой запрос, подобный следующему:

SELECT x 
FROM t
WHERE t.y = z

Если у нас есть одна запись в наборе результатов, я хочу установить переменную @v для этого единственного значения.Если у нас есть две или более записи, я бы хотел, чтобы результаты разделялись запятой и пробелом.Как лучше написать этот код T-SQL?

Пример:

набор результатов из 1 записи:

Value1

набор результатов из 2 записей:

Value1, Value2

набор результатов из 3 записей:

Value1, Value2, Value3

Ответы [ 5 ]

10 голосов
/ 15 марта 2012

это даст вам список значений в списке через запятую

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 голосов
/ 15 марта 2012

Вы можете использовать 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;

Для других опций проверьте Объединение значений строк в SQL .

3 голосов
/ 15 марта 2012

Поскольку это 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) удаляет ведущие ','

1 голос
/ 15 марта 2012

Вы можете использовать для этого рекурсивный 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
1 голос
/ 15 марта 2012

Как насчет чего-то подобного ???

DECLARE @x AS VARCHAR(2000)
SET @x = ''
SELECT @x = @x + RTRIM(x) + ','
FROM t
SELECT @x = SUBSTRING(@x, 1, LEN(@x) - 1)
PRINT @x
...