使用COALESCE函数以逗号分隔值

时间:2012-01-02 12:41:07

标签: sql-server

我有一张表(EMP)我知道使用COALESCE函数我们可以用这种方式获取任何列的值

23,23,45,34

SELECT OfferID  FROM Emp where EmpID= 23

但我没有得到实现此

的语法

解决此问题的任何帮助都会很棒。

5 个答案:

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

更多信息

STUFF (Transact-SQL)

答案 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授权为&lt;。这可以使用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