【发布时间】:2012-01-02 12:41:07
【问题描述】:
我有一张表 (EMP) 我知道使用COALESCE 函数我们可以通过这种方式获取任何列的值
23,23,45,34
SELECT OfferID FROM Emp where EmpID= 23
但我没有获得实现此目的的语法
任何帮助都会很好地解决这个问题。
【问题讨论】:
-
您使用的是什么版本的 SQL Server?
标签: sql-server
我有一张表 (EMP) 我知道使用COALESCE 函数我们可以通过这种方式获取任何列的值
23,23,45,34
SELECT OfferID FROM Emp where EmpID= 23
但我没有获得实现此目的的语法
任何帮助都会很好地解决这个问题。
【问题讨论】:
标签: sql-server
我过去也使用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
【讨论】:
COALESCE 好多了。在那里,我得到了所有行中的所有数字。在这里,我得到了一个唯一行的所有数字。谢谢。
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
【讨论】:
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
【讨论】:
虽然在您的情况下这可能是不可能的,但如果您想在选择列表中也考虑空值,那么您应该使用以下查询:
Declare @singleRowValue varchar(8000) ;
Select @singlerowvalue = COALESCE(@singleRowValue + ',', '') + ISNULL(CAST(OfferID as varchar(30)),'null') from EMP
Select @singleRowValue ;
【讨论】:
Isnull 函数也会给我们同样的结果
DECLARE @List VARCHAR(8000)
SELECT @List = ISNULL(@List + ',', '') + CAST(OfferID AS VARCHAR)
FROM Emp
WHERE EmpID = 23
SELECT @List
【讨论】: