在 SQL Server 中完成 MYSQL 的 Group_Concat [重复]
Posted
技术标签:
【中文标题】在 SQL Server 中完成 MYSQL 的 Group_Concat [重复]【英文标题】:Accomplishing MYSQL's Group_Concat in SQL Server [duplicate] 【发布时间】:2013-06-15 05:00:07 【问题描述】:我正在移植一个我最初编写的应用程序,以便使用 php 和 mysql 数据库在 Apache 上运行。其中一个查询使用了Concat_WS
和Group_Concat
的MySQL 函数,首先将几个不同的列连接成一个字符串,然后连接由Group_By
子句组合在一起的所有项目。
举个例子:
ID Name Candy
1 John M&Ms
1 John KitKat
查询:
Select Group_Concat(Concat_WS('-',Name, Candy) Separator '00--00') as UserCandy
From ExampleTable
Group By ID
结果:
UserCandy
John-M&Ms00--00John-KitKat
现在,我正在尝试使用 PHP 5.4+ 在 SQL Server 2008 中实现相同的结果。
我尝试过的:
SELECT Stuff(name + ';' + candy, 1, 0, '-----') AS UserCandy
FROM test
问题can be seen in the fiddle that I have setup。
预期的结果是:
-----John;MMs-----John;KitKat
最后,当我向组合中添加更多列时,这变得更加困难。我想合并ID相同的结果(如上图)。这对group_concat
非常有效,因为它会自动合并已分组在一起的行。
【问题讨论】:
@bluefeet 我已经看到了这个问题,但我试图避免使用 XML。我真的很想保持我在以前版本的应用程序中使用的格式。 有多种方法可以获取所需格式的数据,但在 SQL Server 中,没有简单的方法可以将多行数据连接成一行。 @bluefeet 那么我怎样才能改变这个问题以便它得到回答而不是关闭呢?我今天已经阅读了大量关于这个主题的书,但我自己仍然没有得到它(显然我现在在这里) @Whathaveyoutried 您可能想解释为什么重复项没有回答您的问题,“相同格式”有点含糊,查询看起来是否存在问题或格式为结果还是……? @JoachimIsaksson 当我自己尝试使用for xml path
时,我得到了一个带有xml 标题的结果,这是我不喜欢的。类似<name>name_here</name>
【参考方案1】:
这可以通过两个步骤来完成。
首先,您可以使用公用表表达式来执行name
和candy
的第一次串联。第一部分使用查询:
;with cte as
(
select id, name+';'+ candy UserCandy
from table_test
)
select *
from cte
见Demo。这给出了一个结果:
| ID | USERCANDY |
--------------------
| 1 | John;MMs |
| 1 | John;KitKat |
完成初始连接后,您可以使用FOR XML PATH
和STUFF
获得最终结果:
;with cte as
(
select id, name+';'+ candy UserCandy
from table_test
)
select distinct c.id,
STUFF(
(SELECT '-----' + c2.UserCandy
FROM cte c2
where c.id = c2.id
FOR XML PATH (''))
, 1, 0, '') AS UserCandy
from cte c;
见SQL Fiddle with Demo。这给出了一个结果:
| ID | USERCANDY |
--------------------------------------
| 1 | -----John;MMs-----John;KitKat |
【讨论】:
我非常感谢这个答案。我将尝试将它与我的实际数据集一起使用,这当然比我发布的要复杂得多。我会尽我所能让它按预期工作,但如果我不能,我会在这里发布一些。再次感谢。 这非常有效。老实说,我不确定我错过了什么。我认为查询被分成两部分的事实是诀窍。我很感激你不急于结束这个,即使答案就在那里,因为我对他们中的任何一个都没有运气。 @Whathaveyoutried 我很高兴你能成功。 这对我来说非常棒! 请注意 => 这不处理 XML 编码用于特殊字符<
、>
和 &
的转义。请参阅 this SO post on how to handle XML encoding 使用 .value()
以上是关于在 SQL Server 中完成 MYSQL 的 Group_Concat [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从程序向 Sql Server 和 MySql 发送查询?