【问题标题】:Using COALESCE function to make values separated with commas使用 COALESCE 函数使值用逗号分隔
【发布时间】:2012-01-02 12:41:07
【问题描述】:

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

23,23,45,34

SELECT OfferID  FROM Emp where EmpID= 23

但我没有获得实现此目的的语法

任何帮助都会很好地解决这个问题。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql-server


【解决方案1】:

说明

我过去也使用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 - 我也觉得这比COALESCE 好多了。在那里,我得到了所有行中的所有数字。在这里,我得到了一个唯一行的所有数字。谢谢。
【解决方案2】:
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

【讨论】:

  • @GertArnold - 谢谢。替换为 Internet 存档链接。我不知道为什么微软不更永久地保留知识库文章。
  • 是的,有时这很麻烦。当命中数等于世界人口时,他们可能会删除它们。
【解决方案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

【讨论】:

    【解决方案4】:

    虽然在您的情况下这可能是不可能的,但如果您想在选择列表中也考虑空值,那么您应该使用以下查询:

    Declare @singleRowValue varchar(8000) ;
    
    Select @singlerowvalue = COALESCE(@singleRowValue + ',', '') + ISNULL(CAST(OfferID as varchar(30)),'null') from EMP
    
    Select  @singleRowValue ;
    

    【讨论】:

      【解决方案5】:

      Isnull 函数也会给我们同样的结果

      DECLARE @List VARCHAR(8000)
      
      SELECT @List = ISNULL(@List + ',', '') + CAST(OfferID AS VARCHAR)
      FROM   Emp
      WHERE  EmpID = 23
      
      SELECT @List 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2015-12-03
        • 2020-10-20
        • 2013-02-23
        • 2023-03-18
        • 1970-01-01
        • 2019-06-17
        相关资源
        最近更新 更多