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

news2024/11/15 13:35:33

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的查询结果语句如下:

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

结果如下:
在这里插入图片描述
对上述语句逐步分析一下,首先看这句:

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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

特斯拉FSD的神经网络(Tesla 2022 AI Day)

这是特斯拉的全自动驾驶&#xff08;Full Self Driver&#xff09;技术结构图&#xff0c;图中把自动驾驶模型拆分出分成了几个依赖的模块&#xff1a; 技术底座&#xff1a;自动标注技术处理大量数据&#xff0c;仿真技术创造图片数据&#xff0c;大数据引擎进不断地更新&…

爬虫安居客新房

一、首先看网址 后面有全部代码 https://hf.fang.anjuke.com/loupan/baohequ/p3 这种形式很好分析&#xff0c;https://hf.fang.anjuke.com/loupan/行政区域页码 xinfang_area ["feixixian", "baohequ", "shushanqu", "luyangqu",…

fiddler流量捕获之winconfig

windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig 按钮可以解除&#xff0c;这个与菜单栏 Tools→Win8 Loopback Exemptions 功能是相同的&#xff0c;流量捕获&#xff1a;指拦截和记录通过计算…

mysql InnoDB行记录格式

在介绍索引的文章已经知道。InnoDB的表数据被拆分成不同的数据页上&#xff0c;默认一个数据页大小是16kb&#xff0c;分布在聚簇索引的叶子节点上。被挂在B树上。一条行记录除了要保存每列具体数据值还会有一些标识位信息。另外对于超长数据存储也有特殊处理。 那么具体到一行…

第2章-OSI参考模型与TCP/IP模型

目录 1. 引入 2. OSI参考模型 2.1. 物理层 2.2. 数据链路层 2.3. 网络层 2.4. 传输层 2.5. 会话层 2.6. 表示层 2.7. 应用层 3. 数据的封装与解封装 4. TCP/IP模型 4.1. 背景引入 4.2. TCP/IP模型&#xff08;4层&#xff09; 4.3. 拓展 1. 引入 1&#xff09;产…

Mac使用adb调试安卓手机

0x00 背景 最近windows电脑休息&#xff0c;用mac办公比较多&#xff0c;手机用时间长了&#xff0c;不太灵光&#xff0c;准备修理一番。于是要用mac调试下android手机。配置略显麻烦&#xff0c;网上的步骤多参差不齐。估计是入门步骤&#xff0c;大佬们也懒得写的太细。于是…

2024/1/18 DFS BFS

目录 奇怪的电梯 马的遍历 PERKET&#xff08;个人认为很抽象&#xff09; 奇怪的电梯 P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff0c;还是用的bfs&#xff0c;建立一个结构体类型的队列&#xff0c;一个存当前的电梯层数&#xff0c;一…

数据库-分库分表初探

文章目录 分库策略垂直切分垂直分库&#xff08;专库专用&#xff09;垂直分表&#xff08;拆表&#xff09;优点缺点 水平(Sharding)切分水平分表库内分表分库分表优点缺点 分表策略hash取模方案range范围区间取值方案映射表方案 分库分表问题事务一致性问题跨节点关联查询跨节…

React16源码: React中的completeUnitOfWork的源码实现

completeUnitOfWork 1 &#xff09;概述 各种不同类型组件的一个更新过程对应的是在执行 performUnitOfWork 里面的 beginWork 阶段它是去向下遍历一棵 fiber 树的一侧的子节点&#xff0c;然后遍历到叶子节点为止&#xff0c;以及 return 自己 child 的这种方式在 performUni…

php no input file specified

一、修改 .user.ini 文件 内容 open_basedir/wab/led-sht.com/:/tmp/ led-sportslight.com是项目根目录位置 改好后保存并清空缓存硬刷新网站就行了 二、mkdir(): Permission denied /core/library/think/cache/driver/File.php 第 84 行左右 mkdir(): Permission denied 这个…

如何用 500 行 SQL 实现 GPT2学习

目录 理论背景实现过程GenerationTokenizerEmbeddingsAttention为什么我们需要有因果掩码&#xff1f;为什么矩阵是 Q&#xff0c;K 和 V&#xff1f; BlocksTokens为什么要使用 softmax 转换概率&#xff1f;Inference 俄罗斯有个大佬每年都会用 SQL 来实现一个挑战庆祝新年&a…

JOSEF约瑟 JGL-15静态带时限过流继电器 柜内安装,板前接线

系列型号 JGL-11反时限过流继电器&#xff1b;JGL-12反时限过流继电器&#xff1b; JGL-13反时限过流继电器&#xff1b;JGL-14反时限过流继电器&#xff1b; JGL-15反时限过流继电器&#xff1b;JGL-16反时限过流继电器&#xff1b; 用途&#xff1a; JGL-15 反时限过流继电器…

(十)Head first design patterns组合模式(c++)

组合模式 组合模式在参考链接中已经讲得很好了&#xff0c;这里只简单讲讲就好。 组合模式的意图是表达部分-整体层次结构。 当你需要管理一个组合对象&#xff0c;又要管理这个组合对象的单个对象。这个时候就可以让这个组合对象和单个对象继承同一个基类&#xff0c;以便用…

Android14实战:调整A2DP音量曲线(五十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

【YOLO系列】 YOLOv4之SAT自对抗训练

一、简介 自对抗训练&#xff08;Self-Adversarial Training&#xff0c;简称SAT&#xff09;是一种新型的数据增强技术&#xff0c;旨在通过神经网络自身进行的对抗式攻击来提高模型的鲁棒性和泛化能力。其主要分为两个阶段&#xff1a; 第一阶段&#xff0c;神经网络会对其原…

C# wpf利用Clip属性实现截屏框

wpf截屏系列 第一章 使用GDI实现截屏 第二章 制作截屏框&#xff08;本章&#xff09; ______第一节 使用DockPanel制作截屏框 ______第二节 利用Clip属性实现截屏框(本节) 第三章 实现截屏框热键截屏 第四章 实现截屏框实时截屏 第五章 使用ffmpeg命令行实现录屏 文章目录 wp…

JVM系列-1.初识JVM

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

Netty篇章(1)—— 核心原理介绍

终于进入到Netty框架的环节了&#xff0c;前面介绍了大量的Java-NIO的内容&#xff0c;核心的内容Selector、Channel、Buffer、Reactor掌握了&#xff0c;那么学起来Netty也是水到渠成的事情。如果没有掌握前面的内容那么学Netty会非常吃力&#xff0c;下面讲解Netty核心原理与…

界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(一)

由DevExpress开发的快速且功能完整的ASP.NET Web Forms的Data Grid组件&#xff0c;从全面的数据塑造和数据过滤选项到十多个集成数据编辑器&#xff0c;该套件提供了帮助用户构建极佳数据所需的一些&#xff0c;没有限制&#xff01; P.S&#xff1a;DevExpress ASP.NET Web …

探索设计模式的魅力:一次设计,多次利用,深入理解原型模式的设计艺术

原型模式是一种设计模式&#xff0c;属于创建型模式的一种&#xff0c;它用于创建重复的对象&#xff0c;同时又能保持性能。在原型模式中&#xff0c;通过复制现有对象的原型来创建新对象&#xff0c;而不是通过实例化类来创建对象。这样做可以避免耗费过多的资源开销&#xf…