Использование функции COALESCE для разделения значений запятыми
У меня есть таблица (EMP
). Я знаю, что с помощью функции COALESCE
мы можем получить значения любого столбца таким образом
23,23,45,34
SELECT OfferID FROM Emp where EmpID= 23
но я не получаю синтаксис для достижения этого
Любая помощь будет большой, чтобы решить эту проблему.
Ответы
Ответ 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 как <
. Это можно решить, используя директиву 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