for xml path是将结果集以XML的格式返回;
用的比较多的地方,就是group by之后,拼接字符串返回
举个例子,看一下for xml path的神奇之处;
create table subjects(name varchar(20),subject varchar(20))
insert into subjects
select '小红' ,'高数'
union all
select '小红','音乐'
union all
select '小明','体育'
union all
select '小明','武术'
union all
select '小明','化学'
union all
select '小兰','生物'
创建一张表subjects,有三个人,小红,小明和小兰,分别选修了不同的科目;
执行以下语句,查看得出的结果有什么不同。会发现:
–path后小括号跟的是行与行之间的分隔符
–列如果没有拼接,则列名就是列之间的分隔符
--path后小括号跟的是行与行之间的分隔符
--列如果没有拼接,则列名就是列之间的分隔符
select subject from subjects for xml path;
select subject as sb from subjects for xml path('aaa');
select ','+subject from subjects for xml path('');

所以,写select 语句返回拼接字符串的时候,只需要将path后跟(‘’),select后添加列分割符号,如单引号,分号等就可以了;
select s.name,( select ','+b.subject from subjects as b where b.name=s.name for xml path(''))
from subjects as s
--group by name

select ‘,’+b.subject 或者select b.subject+’,’
可以看出subjects中有多余的分隔符,可在前可在后。所以,去掉分隔符可以使用left,right,stuff函数。
--使用stuff去除首位分隔符
select s.name,stuff(( select ','+b.subject from subjects as b where b.name=s.name for xml path('')),1,1,'') as subjects
from subjects as s
group by name
--使用left函数截取字符串
select name ,right(subjects,len(subjects)-1) as subjects from (
select s.name,( select ','+b.subject from subjects as b where b.name=s.name for xml path('')) as subjects
from subjects as s
group by name)as a
得出的结果一样

延伸:STUFF结合FOR XML PATH可以用来拼接JSON字符串,
select '['+ stuff((select ',{"name": "' + name + '","subjects": "' + subject + '"}'
from subjects for xml path('')),1,1,'') +']'
结果如下:
[{“name”: “小红”,“subjects”: “高数”},
{“name”: “小红”,“subjects”: “音乐”},
{“name”: “小明”,“subjects”: “体育”},
{“name”: “小明”,“subjects”: “武术”},
{“name”: “小明”,“subjects”: “化学”},
{“name”: “小兰”,“subjects”: “生物”}]
————————————————
版权声明:本文为CSDN博主「向阳的花儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Julcia/article/details/106841085
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




