SQL之 Stuff和For xml path 将多行放入一行

stuff:

作用

stuff(param1, startIndex, length, param2)
将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。

示例

select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg'
select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg'
select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg'
select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'

一.FOR XML PATH 简单介绍

假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:


接下来我们来看应用FOR XML PATH的查询结果语句如下:

SELECT * 
FROM @hobby 
FOR XML PATH

结果:

<row>
  <hobbyID>1</hobbyID>
  <hName>爬山</hName>
</row>
<row>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</row>
<row>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</row>

改变XML行节点的名称:

SELECT * 
FROM @hobby 
FOR XML PATH('MyHobby')

原来的行节点<row> 变成在PATH()中自定义的名称<MyHobby>,结果如下:

<MyHobby>
  <hobbyID>1</hobbyID>
  <hName>爬山</hName>
</MyHobby>
<MyHobby>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</MyHobby>
<MyHobby>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</MyHobby>

列节点如何改变呢:

SELECT hobbyID as 'MyCode',hName as 'MyName' 
FROM @hobby 
FOR XML PATH('MyHobby')

列的节点名称也会变成自定义的名称 <MyCode>与<MyName>结果如下:

<MyHobby>
  <MyCode>1</MyCode>
  <MyName>爬山</MyName>
</MyHobby>
<MyHobby>
  <MyCode>2</MyCode>
  <MyName>游泳</MyName>
</MyHobby>
<MyHobby>
  <MyCode>3</MyCode>
  <MyName>美食</MyName>
</MyHobby>

自定义输出方式:

SELECT '[ '+hName+' ]' FROM @hobby FOR XML PATH('')

结果如下

[ 爬山 ][ 游泳 ][ 美食 ]

其他类型的列,将它们转换成字符串类型:

SELECT '{'+STR(hobbyID)+'}','[ '+hName+' ]' 
FROM @hobby 
FOR XML PATH('')

二.一个应用场景

一张学生表,列分别为(stuID,sName,hobby)

  • stuID代表学生编号
  • sName代表学生姓名
  • hobby列存学生的爱好

表结构如下:


要求是查询学生表,显示所有学生的爱好的结果集,代码如下:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 
FROM (
  SELECT sName,(SELECT hobby+',' 
                 FROM student
                 WHERE sName=A.sName
                 FOR XML PATH('')) AS StuList
  FROM student A
  GROUP BY sName
) B

结果如下:


  • 通过FOR XML PATH 将爱好,显示成格式为:“ 爱好1,爱好2,爱好3,”的格式!
  • 外层的语句:LEFT(StuList,LEN(StuList)-1) 就是来去掉逗号
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,...
    大熊_7d48阅读 656评论 0赞 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 29,293评论 1赞 45
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,318评论 0赞 8
  • 一. Java基础部分.................................................
    wy_sure阅读 4,129评论 0赞 11
  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,389评论 0赞 7

友情链接更多精彩内容