我有一张表(EMP
)我知道使用COALESCE
函数我们可以用这种方式获取任何列的值
23,23,45,34
SELECT OfferID FROM Emp where EmpID= 23
但我没有得到实现此
的语法解决此问题的任何帮助都会很棒。
答案 0 :(得分:41)
我过去也使用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
答案 1 :(得分:37)
DECLARE @List VARCHAR(8000)
SELECT @List = COALESCE(@List + ',', '') + CAST(OfferID AS VARCHAR)
FROM Emp
WHERE EmpID = 23
SELECT @List
这种聚合连接方法是not guaranteed to work。如果您至少使用SQL Server 2005 XML PATH
或首选CLR聚合。
关于这个主题的权威性文章是Concatenating Row Values in Transact-SQL
答案 2 :(得分:3)
dknaack solution有一些缺点,当文本包含一些XML字符,例如<
时,它们被html授权为<
。这可以使用TYPE
指令解决,该指令将响应发送为xml,然后将原始value
提取为字符串。
本文中有更多解决方案可以解决这个问题: Concatenating Row Values in 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
答案 3 :(得分:0)
虽然在您的情况下可能无法实现,但如果您也想在选择列表中考虑空值,那么您应该使用以下查询:
Declare @singleRowValue varchar(8000) ;
Select @singlerowvalue = COALESCE(@singleRowValue + ',', '') + ISNULL(CAST(OfferID as varchar(30)),'null') from EMP
Select @singleRowValue ;
答案 4 :(得分:-2)
Isnull功能也会给我们相同的结果
DECLARE @List VARCHAR(8000)
SELECT @List = ISNULL(@List + ',', '') + CAST(OfferID AS VARCHAR)
FROM Emp
WHERE EmpID = 23
SELECT @List