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的查询结果语句如下:
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
FOR XML PATH 函数与同一分组下的字符串拼接的更多相关文章
- FOR XML PATH 函数用法
一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下: 接下来我们来看 ...
- SQL多行并一行统计例子之STUFF()函数+FOR XML PATH()函数应用
SELECT * FROM tbiz_ProjectRelation 目标统计每个项目有几条申请记录 Step1 SELECT ProjectID , RelationIDs , , '') FROM ...
- SQL SERVER数据库内 FOR XML PATH 函数用法
把自己点点滴滴的学习记录下来!!!! 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(TBJTXXCE)用来存放就诊患者信息,表结构 ...
- sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符
由于项目的原因,需要将一些记录分类汇总,但还要列出相关的明细,这样的需求我还是第一次遇到,蛋疼了,还是请求一下度娘吧.搜索一番还是有结果,请看以下例子: create table tb ([id] i ...
- sql server 使用for xml path 将1列多行转换为字符串连接起来
create table tb ([id] )) insert into tb ,'aa' union all ,'bb' union all ,'cc' union all ,'dd' union ...
- sql server 横向转丛向及FOR XML PATH使用
1.开始数据结构如下: 2.转为如下图: 使用如下SQL语句: ---横向转丛向 select name '姓名', max(case when course='语文' then score end) ...
- 使用 SQL的 for xml path来进行字符串拼接
本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据. 我的讲解步骤: 1:构造初始数据 2:提出问题 3: ...
- 合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数 (转)
转自: http://www.cnblogs.com/aolin/archive/2011/04/12/2014122.html 示例表 tb 数据如下 id value—————1 aa1 bb2 ...
- sql分组合并字段重复项sql for xml path
-------------------------(情景描述) 在我们处理数据时,可能会碰到这种情景: Id Name 1 a,b 2 ...
- Sql Server合并多行询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数
示例表 tb 数据如下 id value ----- 1 aa 1 bb 2 aaa 2 bbb 2 ccc SELECT id, [val] = ( SELECT [value] + ',' FRO ...
随机推荐
- lombok用法
加入 maven 依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lo ...
- ConcurrentHashMap扩容过程
一.ConcurrentHashMap扩容过程 1.ConcurrentHashMap扩容时新建数组 1.1 每个线程负责的数据迁移区域的长度:stride 1.2 关于transferIndex的说 ...
- Spring Bean的声明方式
一.环境说明 项目结构 StudentService package com.cookie.service; /** * @author cxq * @version 1.0 * @date 2020 ...
- IP、端口相关
Windows端口被占用 按住[Windows+R]键输入cmd回车 输入命令[netstat -aon|findstr "端口号"]后按回车,找对最后一列对应的数字,即为这个端口 ...
- .NET Core短信验证(分布式session)
一.手机短信验证码登录过程 1.构造手机验证码,需要生成一个6位的随机数字串: 2.找短信平台获取使用接口向短信平台发送手机号和验证码,然后短信平台再把验证码发送到制定手机号上 3.将手机号验证码.操 ...
- Sentinel——服务降级
目录 简介 Sentinel方法级降级 Sentinel类级降级 OpenFeign类级降级 简介 服务降级是一种增强用户体验的方式.当用户的请求由于各种原因被拒后,系统返回-一个事先设定好的.用户可 ...
- 【记录】Python3|Python出现循环引用模块怎么办?(又称循环依赖)
前言 在Python开发过程中,尤其是在大型项目中,我们经常会遇到模块间相互依赖的情况.这种相互依赖,即所谓的"循环引用",往往会导致代码难以维护,并可能引发各种运行时问题.在这篇 ...
- SQL 条件求和
SUMIF 就是 Excel 中的 sumif () 函数的功能. 工作中用的频率极其高, 像我就几乎天天在用的呢. 也是做个简单的笔记而已. 为啥我总是喜欢对比 Excel 呢, 因为我也渐渐发现, ...
- TVM:设计与架构
本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员.页面组织如下: 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤.要开始使用,请先阅读本节. 逻辑架构组件部分描 ...
- ASP.NET Core中DI中Add*方法对类的假定
在ASP.NET Core的依赖注入(DI)容器中,当你使用Add*方法和泛型类型来指定要注册的类时,容器会做出以下假设: (1)类必须是具体类(Concrete Class):使用Add*方法注册的 ...