Подтвердить что ты не робот

Использование функции COALESCE для разделения значений запятыми

У меня есть таблица (EMP). Я знаю, что с помощью функции COALESCE мы можем получить значения любого столбца таким образом

23,23,45,34

SELECT OfferID  FROM Emp where EmpID= 23

но я не получаю синтаксис для достижения этого

Любая помощь будет большой, чтобы решить эту проблему.

4b9b3361

Ответ 1

DECLARE @List VARCHAR(8000)

SELECT @List = COALESCE(@List + ',', '') + CAST(OfferID AS VARCHAR)
FROM   Emp
WHERE  EmpID = 23

SELECT @List 

Этот подход к объединению конкатенации не гарантированно работает. Если вы используете хотя бы SQL Server 2005 XML PATH или CLR, предпочтительны агрегаты.

Окончательная статья на эту тему Объединение значений строк в Transact-SQL

Ответ 2

Описание

Я сделал это с использованием COALESCE в прошлом, но я предлагаю другой подход, потому что вам не нужна переменная. Используйте функцию T-SQL STUFF, чтобы сделать это.

Пример

SELECT STUFF((
    select ','+ cast(OfferID as nvarchar(255)) 
    from Emp b
    WHERE a.EmpID= b.EmpID
    FOR XML PATH('')
    ),1,1,'') AS COLUMN2
FROM Emp a
GROUP BY a.EmpID

Дополнительная информация

STUFF (Transact-SQL)

Ответ 3

Описание

Решение dknaack имеет некоторые недостатки, когда текст содержит некоторые XML-символы, такие как <, которые html-entitized как &lt;. Это можно решить, используя директиву TYPE, которая отправляет ответ как xml, а затем извлекает строку raw value как. >

В этой статье есть много решений проблемы: Объединение значений строк в T-SQL

Пример

SELECT STUFF((
    select ','+ cast(OfferID as nvarchar(255)) 
    from Emp b
    WHERE a.EmpID= b.EmpID
    FOR XML PATH(''), TYPE
    ).value('.', 'varchar(max)')
    ,1,1,'') AS COLUMN2
FROM Emp a
GROUP BY a.EmpID

Ответ 4

Функция Isnull также даст нам тот же результат

DECLARE @List VARCHAR(8000)

SELECT @List = ISNULL(@List + ',', '') + CAST(OfferID AS VARCHAR)
FROM   Emp
WHERE  EmpID = 23

SELECT @List