Sql server 将列值连接到逗号分隔的列表中

Sql server 将列值连接到逗号分隔的列表中,sql-server,tsql,Sql Server,Tsql,设置输出格式以使列值显示为字符串(用逗号分隔)的TSQL语法是什么 例如,my table CARS具有以下功能: CarID CarName ---------------- 1 Porsche 2 Mercedes 3 Ferrari 如何获取汽车名称:Porsche、Mercedes、Ferrari例如,您可以使用coalesce创建一个快捷方式,将表中记录中的一系列字符串连接起来 declare @aa varchar (

设置输出格式以使列值显示为字符串(用逗号分隔)的TSQL语法是什么

例如,my table CARS具有以下功能:

CarID    CarName  
----------------
    1    Porsche  
    2    Mercedes  
    3    Ferrari  

如何获取汽车名称:Porsche、Mercedes、Ferrari

例如,您可以使用coalesce创建一个快捷方式,将表中记录中的一系列字符串连接起来

declare @aa varchar (200)
set @aa = ''

select @aa = 
    case when @aa = ''
    then CarName
    else @aa + coalesce(',' + CarName, '')
    end
  from Cars

print @aa

感谢所有向我展示了在查询过程中使用累积数据的人。

查询中的另一种解决方案:

SELECT LEFT(Car, LEN(Car) - 1)
FROM (
    SELECT Car + ', '
    FROM Cars
    FOR XML PATH ('')
  ) c (Car)
select 
    Id, 
    STUFF(
        (select (', "' + od.ProductName + '"')
        from OrderDetails od (nolock)
        where od.Order_Id = o.Id
        order by od.ProductName
        FOR XML PATH('')), 1, 2, ''
    ) ProductNames
from Orders o (nolock)
where o.Customer_Id = 525188
order by o.Id desc

编辑:感谢@user007的材料声明

您可以使用材料:

SELECT Stuff(
    (
    SELECT ', ' + CARS.CarName
    FROM CARS
    FOR XML PATH('')
    ), 1, 2, '') AS CarNames

如果您在SQL Server 2017或Azure SQL数据库上运行,请执行以下操作:

 SELECT STRING_AGG(CarName,',') as CarNames
 FROM CARS 

请使用以下代码尝试此操作:

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' , '') + CarName
FROM Cars
SELECT @listStr


如果您使用的是MySQL,请在此处分组“concatfield”。如果您使用的是PostgreSQL,那么这里的数组到字符串数组到accumfield。但是因为您使用的是MSSQL,所以只需创建一个返回逗号分隔字符串的函数。使用ConcernedOfTunbridgeW代码段,放入function@van当前位置在我看来,这个问题的提出方式似乎至少他努力做到尽可能清晰,并保持可读性,因此,我认为他也不辞辛劳地试图自己找到答案。可能是@van的复制品,这很有趣,我以为你的评论是最近的,然后我注意到它已经超过5年了;这个问题,谢谢。我从未见过这种命名子查询列的语法。我想知道您是否可以编辑您的答案,以包括TSQL语法中允许这一点的部分?这是我在Stackoverflow这里学到的构造。我不知道它在哪里,甚至在任何TSQL规范中都没有提到。我想知道这一个是否比下面Vaibhav给出的答案快或慢。。。这两种解决方案都很棒,而且代码片段可以重复使用。我怀疑是否有任何性能差异值得注意,因为这两种解决方案的工作内容是相同的。但和往常一样,在不同的场景中尝试这两种方法,如果您想确定,请测量。如果CarName是一个int-ie,CarId,请选择@CarList+=CONVERTvarchar20,CarId,0+N',“为什么在第一次检查时init@aa-to而不只是检查为null?”?还有,为什么要合并?最后,为了安全,你不想用isnullCarName来包装CarName吗?你的结合在错误的地方;它应该像@aa+coalesce'、'+CarName那样包装CarName,选中建议的编辑将CarName转换为空字符串,以防其为null。正如您所看到的,@aa将在每次CarName为NULL时被屏蔽。@concerndoftundbridgewells-这种方法可以用于执行动态SQL语句吗,例如:选择col1作为“col1 name”,选择coln作为“coln name”FROM?@NickBraunagel是的,您可以这样做,我以前也做过。谢谢,我最后添加了括号[围绕显示名称来实现这一点。NetezzaNice one中是否有解决方案用于添加where和order子句基本上只是此处答案的简化版本--但我发现这一简单性更易于移植,因为您可以将其插入到SSMSBoost或Redgate SQLPrompt之类的代码段管理器中,并将其保存在您自己的p中Personal toolbox@PhilS,不,它会给出正确的答案,如果您对姓名的employee表运行上述查询,示例结果将是Jhon,Thomas,PhilS@john:哦,你说得对。对不起,是我的错。我本想取消否决票,但除非答案被编辑,否则系统不允许我……该是创建此函数的时候了!eqiValent到Listag是一个很长的发展过程,并且应该在SQL Server 2017中使用。
 SELECT STRING_AGG(CarName,',') as CarNames
 FROM CARS 
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' , '') + CarName
FROM Cars
SELECT @listStr