【问题标题】:Concat field value to string in SQL Server将字段值连接到 SQL Server 中的字符串
【发布时间】:2010-12-09 22:55:18
【问题描述】:

我需要一个与 SQL Server 中的 Oracle WM_CONCAT 类似的函数,它返回一个逗号分隔的列表,其中包含您作为参数传递的任何字段。例如,在 Oracle 中,

select WM_CONCAT(first_name) from employee where state='CA' 

返回“约翰、吉姆、鲍勃”。

如何在 SQL Server 中执行此操作?

谢谢

【问题讨论】:

    标签: sql sql-server csv concatenation


    【解决方案1】:

    在 SQL Server 2017 中添加了 STRING_AGG 函数

    SELECT t.name as TableName
          ,STRING_AGG(c.name, ';') AS FieldList
      FROM sys.tables t
      JOIN sys.columns c 
        ON t.object_id = c.object_id
      GROUP BY t.name;
    

    【讨论】:

      【解决方案2】:
       SELECT Field1, Substring(Field2, 2, LEN(Field2)) AS Field2 FROM
      (
          SELECT
              [InnerData].Field1,
              (SELECT  ',' + Field2 FROM @Fields WHERE Field1=[InnerData].Field1 FOR XML PATH('')) AS Field2
              FROM
              (
                  SELECT DISTINCT Field1 FROM @Fields
              ) AS [InnerData]
      ) AS OuterData
      

      我从这个链接得到这个查询

      Refer this Link for more Clarification

      【讨论】:

        【解决方案3】:

        试试这个

         select    
            wm_concat(name) 
         from
            employee
         where
            state='CA'
         group by
            state
        

        【讨论】:

        • 这是不正确的。正如 OP 所指出的,它在 SQL Server 中不起作用。如果您有不同的意思,您可能希望删除它或编辑它?
        【解决方案4】:

        试试这个:

        
            drop table #mike_temp 
        go
        
        select * into #mike_temp 
          from (select 'Ken'  as firstname, 'CO' as state
                 union all
                select 'Mike' as firstname, 'CO' as state
                 union all
                select 'Tom' as firstname , 'WY' as state
               ) a
        go
        
        SELECT distinct 
               state
              ,STUFF((SELECT ', ' + b.firstname FROM #mike_temp b where a.state = b.state FOR XML PATH('')),1, 2, '') AS CSVColumn
          from #mike_temp a
        

        【讨论】:

          【解决方案5】:

          实际答案:

          SELECT
             SUBSTRING(buzz, 2, 2000000000)
          FROM
              (
              SELECT 
                  firstname
              FROM 
                  employee
              WHERE
                  State = 'CA'
              FOR XML PATH (',')
              ) fizz(buzz)
          

          这里有一个常见问题。一些搜索:

          【讨论】:

          • 值得注意的是,这仅对 SQL Server 2005 及更高版本有效。 OP 没有说明他们使用的是哪个版本的 SQL Server。
          • 您可以用 STUFF 命令替换 SUBSTRING,该命令无需知道字符串长度即可正常运行。
          • @Chris J:我会说 SQL 2k5 是一个合理的假设,即 SQL 2000 RTM 和 2.5 版本之后的 10 年
          • 2147483647 是你的朋友...记住它。
          【解决方案6】:

          AFAIK,你需要自己做。

          您可以构建一个用户定义的函数,该函数使用游标循环 Employee 的记录,其中状态为 CA,并返回其姓名的串联。

          【讨论】:

          • 不,根本不需要使用 CURSOR。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-08
          相关资源
          最近更新 更多