在SQL Server中将字段值连接成字符串

8
我需要在SQL Server中找到与Oracle的WM_CONCAT类似的函数,该函数返回以逗号分隔的参数字段列表。例如,在Oracle中,
select WM_CONCAT(first_name) from employee where state='CA' 

返回 "John, Jim, Bob"。

如何在SQL Server中实现这个功能?

谢谢。

6个回答

4
在 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;

3
实际答案:
SELECT
   SUBSTRING(buzz, 2, 2000000000)
FROM
    (
    SELECT 
        firstname
    FROM 
        employee
    WHERE
        State = 'CA'
    FOR XML PATH (',')
    ) fizz(buzz)

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


3
值得注意的是,这仅适用于 SQL Server 2005 及更高版本。OP 没有说明他们正在使用哪个版本的 SQL Server。 - Chris J
1
您可以使用STUFF命令替换SUBSTRING,它可以正常运行而无需知道字符串长度。 - WesleyJohnson
1
@Chris J:我认为SQL 2k5是一个合理的假设,即在SQL 2000 RTM发布10年后,版本更新了2.5个版本。 - gbn
1
2147483647是你的好朋友... 记住它。 - ErikE

2

试试这个:


    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

0
 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

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

请参考此链接以获得更多澄清


0
据我所知,您需要自己完成这个任务。
您可以构建一个用户定义的函数,使用游标循环遍历员工记录,其中状态为CA,并返回他们姓名的连接字符串。

不需要使用CURSOR。 - gbn

-3

试一下这个

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

这不正确。正如 OP 指出的那样,它在 SQL Server 中无法工作。如果您的意思不同,您可能希望将其删除或编辑? - criticalfix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接