使用COALESCE函数将值用逗号分隔
使用COALESCE函数将值用逗号分隔是一种常见的需求。例如,在一个表中,我们可能有一个包含多个值的列,我们希望将这些值用逗号分隔并显示在一个单独的列中。
然而,在SQL Server中,没有直接的函数可以实现这个目标。幸运的是,有一种解决方法可以使用COALESCE函数来实现这个目标。
问题的出现是因为当文本中包含一些XML字符(如<)时,会被html实体化为<。这个问题可以通过使用TYPE指令将响应发送为xml,然后将原始值提取为字符串来解决。
下面是一种解决方法的示例代码:
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
在这个示例代码中,我们使用COALESCE函数将多个OfferID值用逗号分隔并显示在一个名为COLUMN2的列中。我们首先使用FOR XML PATH('')将多个OfferID值连接在一起,然后使用TYPE将响应发送为xml。最后,我们使用value函数提取原始值作为字符串,并使用STUFF函数将第一个逗号替换为空字符串。
这样,我们就可以使用COALESCE函数将多个值用逗号分隔并显示在一个单独的列中。这种解决方法非常灵活,可以适用于各种情况下的值分隔需求。
使用COALESCE函数将值用逗号分隔的问题的出现原因是在过去也使用了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)](http://msdn.microsoft.com/en-us/library/ms188043.aspx)
+1 - 我也认为这种方法比COALESCE更好。在使用COALESCE时,我得到了所有行中的所有数字。而在这种方法中,我只得到了一个唯一行的所有数字。谢谢。
使用COALESCE函数将值用逗号分隔开的方法在某些情况下并不保证有效。如果您使用的是至少SQL Server 2005版本,建议使用XML PATH或CLR聚合函数。
这个问题的解决方法可以参考Concatenating Row Values in Transact-SQL这篇文章。
对于这个问题,微软的支持文章可能不再保留。可能是当点击次数超过全球人口数量时,他们会删除这些文章。
是的,有时候这真的很烦人。他们可能会在点击次数达到全球人口数量时删除这些文章。
文章来源:https://web.archive.org/web/20080203143315/http://support.microsoft.com/kb/287515