FOR XML PATH 函数与同一分组下的字符串拼接

这篇具有很好参考价值的文章主要介绍了FOR XML PATH 函数与同一分组下的字符串拼接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FOR XML PATH 简单介绍

FOR XML PATH 语句是将查询结果集以XML形式展现,通常情况下最常见的用法就是将多行的结果,拼接展示在同一行。
首先新建一张测试表并插入数据:

CREATE TABLE #Test (
    Name varchar(70),
    Hobby varchar(70)
);

insert #Test
select '张三','游泳' union
select '张三','爬山' union
select '张三','游戏' union
select '李四','唱歌' union
select '李四','睡觉' 

select * from #Test;

查询结果如下:
FOR XML PATH 函数与同一分组下的字符串拼接,SQL,xml,数据库,sql
接下来应用FOR XML PATH的查询结果语句如下:

SELECT * FROM #Test FOR XML PATH

在查询结果中会出现一个可点击的XML链接,点击后结果如下:

<row>
  <Name>李四</Name>
  <Hobby>唱歌</Hobby>
</row>
<row>
  <Name>李四</Name>
  <Hobby>睡觉</Hobby>
</row>
<row>
  <Name>张三</Name>
  <Hobby>爬山</Hobby>
</row>
<row>
  <Name>张三</Name>
  <Hobby>游戏</Hobby>
</row>
<row>
  <Name>张三</Name>
  <Hobby>游泳</Hobby>
</row>

可见FOR XML PATH 可以将查询后结果根据行输出成XML格式。那么变为XML格式有什么好处呢?我们一般在使用select 列 from 表语句时查询出来的结果都是按照列输出的,如果要得到列中的一个数据就需要加各种筛选条件。而XML格式可以通过<>中的节点来筛选出数据,从而由select语句的列级别操作变为类似于Excel基于行列定位的单元格级别操作

FOR XML PATH应用

1.分组拼接

如果要显示所有人的爱好的结果集,并且要每个人的所有兴趣显示在一行中,代码如下:

SELECT 
Name,
STUFF((SELECT ','+Hobby FROM #Test WHERE Name=T.Name FOR XML PATH('')),1,1,'') AS All_Hobby  
FROM #Test T GROUP BY T.Name

结果如下:
FOR XML PATH 函数与同一分组下的字符串拼接,SQL,xml,数据库,sql
对上述语句逐步分析一下,首先看这句:

SELECT ','+Hobby FROM #Test WHERE Name=T.Name FOR XML PATH('')

这句是通过FOR XML PATH 将某一姓名如张三的爱好,显示成格式为:“ ,爱好1,爱好2,爱好3,…”的格式,WHERE Name=T.Name这一个条件用来判断筛选对应姓名的爱好,如果没有WHERE Name=T.Name这一个条件的话就会连接整个表中所有的爱好,无法分组

接着用STUFF函数将拼接完成后字符第一个’,'替换成空,STUFF函数第一个参数为要操作的字符串,第二个为从第几个开始替换下标从1开始,第三个参数为替换的个数,第四个参数为替换的字符)
简单举几个例子:

select STUFF('abc',1,1,'*') 执行结果为:*abc
select STUFF('abc',1,0,'*') 执行结果为:*bc
select STUFF('abc',2,2,'*') 执行结果为:a**

最终输出上述按照姓名分组后每个人对应的爱好

在MySQL 中可以用group_concat这个函数来实现这一功能

多行数据拼接

FOR XML PATH可以实现对一列中多行数据进行拼接,可以使用行节点与列节点并自定义输出格式:

-- 还可以通过符号+号来对字符串类型字段的输出格式进行修改
SELECT '[ '+Hobby+' ]' FROM #Test FOR XML PATH('')
--输出结果为: [ 唱歌 ][ 睡觉 ][ 爬山 ][ 游戏 ][ 游泳 ]


--如有其他数据类型的列转换成字符串类型再拼接
SELECT '{'+STR(ID)+'}','[ '+Hobby+' ]' FROM #Test FOR XML PATH('')

JSON格式输出

STUFF结合FOR XML PATH可以用来拼接JSON字符串,

select '['+ stuff((select ',{"name": "' + name + '","subjects": "' + Hobby + '"}'
from #Test for xml path('')),1,1,'') +']'
--[{"name": "李四","subjects": "唱歌"},{"name": "李四","subjects": "睡觉"},{"name": "张三","subjects": "爬山"},{"name": "张三","subjects": "游戏"},{"name": "张三","subjects": "游泳"}]

节点名称的修改

再来看一下如何改变XML行节点名称,如果我们想修改对应数据的节点名称,代码如下:

SELECT * FROM  #Test  FOR XML PATH('MyHobby')

运行后输出结果把原来的行节点 变成了在PATH后面括号()中自定义的名称,结果如下:

<MyHobby>
  <Name>李四</Name>
  <Hobby>唱歌</Hobby>
</MyHobby>
<MyHobby>
  <Name>李四</Name>
  <Hobby>睡觉</Hobby>
</MyHobby>
<MyHobby>
  <Name>张三</Name>
  <Hobby>爬山</Hobby>
</MyHobby>
<MyHobby>
  <Name>张三</Name>
  <Hobby>游戏</Hobby>
</MyHobby>
<MyHobby>
  <Name>张三</Name>
  <Hobby>游泳</Hobby>

那么列节点如何改变呢?可以使用关键字AS修改列节点名称,代码如下:

SELECT Name as 'MyName',Hobby as 'MyHobby' FROM #Test FOR XML PATH('MyHobby')

结果如下:

<MyHobby>
  <MyName>李四</MyName>
  <MyHobby>唱歌</MyHobby>
</MyHobby>
<MyHobby>
  <MyName>李四</MyName>
  <MyHobby>睡觉</MyHobby>
</MyHobby>
<MyHobby>
  <MyName>张三</MyName>
  <MyHobby>爬山</MyHobby>
</MyHobby>
<MyHobby>
  <MyName>张三</MyName>
  <MyHobby>游戏</MyHobby>
</MyHobby>
<MyHobby>
  <MyName>张三</MyName>
  <MyHobby>游泳</MyHobby>
</MyHobby>

参考文章:
https://www.cnblogs.com/yasuo2/p/6433697.html
FOR XML PATH 函数与同一分组下的字符串拼接,SQL,xml,数据库,sql文章来源地址https://www.toymoban.com/news/detail-819275.html

到了这里,关于FOR XML PATH 函数与同一分组下的字符串拼接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .Net 中实体类转换为XML字符串, 确保字符串头部是utf-8 不是utf-16

    使用 Utf8StringWriter 或类似的方法来确保在序列化过程中使用正确的编码。然而, Utf8StringWriter 不是.NET Core或.NET Standard库的一部分,因此你需要自己实现一个。 不过,有一种更简单的方法可以达到相同的效果,那就是使用 StringWriter 与 Encoding.GetEncoding(\\\"utf-8\\\") 结合,但这实际上

    2024年01月23日
    浏览(41)
  • 【项目学习1】如何将java对象转化为XML字符串

    将java对象转化为XML字符串,可以使用Java的XML操作库JAXB,具体操作步骤如下: 主要分为以下几步: 1、创建JAXBContext对象,用于映射Java类和XML。 2、创建Marshaller对象,用于将Java对象序列化为XML。 3、配置Marshaller参数,例如设置XML输出格式、是否格式化输出等。 4、调用Marsha

    2024年02月14日
    浏览(45)
  • 【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 XML 的概念,以及 Java 中 XML 和字符串的转换方法,并给出了样例代码。

    2024年02月09日
    浏览(57)
  • C语言:字符函数和字符串函数(一篇拿捏字符串函数!)

    目录 求字符串长度: 1. strlen(字符串长度) 长度不受限制函数: 2. strcpy(字符串拷贝) 3. strcat(字符串追加) 4. strcmp(字符串比较) 长度受限制函数: 5. strncpy(字符串拷贝) 6. strncat(字符串追加) 7. strncmp(字符串比较) 字符串查找: 8. strstr(查找字符串子串) 9. strtok(字符串分割) 错误信

    2024年02月10日
    浏览(105)
  • 字符串函数和字符函数

    在C语言中,我们经常会遇到字符串的处理,我们要是每当用到字符串总要自己写函数去解决问题的时候,未免有些麻烦,所以在这里我们可以调用库中的 “ string.h \\\" 的头函数来解决问题;下面就对一些经常使用的字符函数和字符串函数进行使用讲解和函数解析; size_t strle

    2024年02月15日
    浏览(45)
  • 字符函数和字符串函数

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数. 字符串已经 \\\'\\0\\\' 作为结束标志,strlen函数返回的是在字符串中 \\\'\\0\\\' 前面出现的字符个数(不包

    2024年02月07日
    浏览(47)
  • 字符函数和字符串函数(2)

      目录 memcpy memmove memcmp 1.函数memcpy从source的位置开始向后 复制num个字节 的数据到destination的内存位置。 2.这个函数在遇到 \\\'\\0\\\' 的时候并不会停下来。 3.如果source和destination有任何的重叠,复制的结果都是未定义的。 memcpy是内存拷贝,拷贝字符串、整形数组、结构体数据。

    2024年02月10日
    浏览(38)
  • 【C语言】字符函数,字符串函数,内存函数

    大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower(将大写字母转化为小写字母) 1.2.2 toupper(将小写字母转化为大写字母) 2. 字符串函数 2.1 字符串输入函数 2.1.1 gets() ​2.1.2 fgets() 2.2 字符串

    2024年02月10日
    浏览(60)
  • C/C++字符函数和字符串函数详解————长度受限制的字符串函数

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言         2.长度受限制的字符串函数 2.1strncpy函数 2.2strncat函数 2.3strncmp函数

    2024年02月08日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包