FOR XML PATH 簡(jiǎn)單介紹
FOR XML PATH 語句是將查詢結(jié)果集以XML形式展現(xiàn),通常情況下最常見的用法就是將多行的結(jié)果,拼接展示在同一行。
首先新建一張測(cè)試表并插入數(shù)據(jù):
CREATE TABLE #Test (
Name varchar(70),
Hobby varchar(70)
);
insert #Test
select '張三','游泳' union
select '張三','爬山' union
select '張三','游戲' union
select '李四','唱歌' union
select '李四','睡覺'
select * from #Test;
查詢結(jié)果如下:
接下來應(yīng)用FOR XML PATH的查詢結(jié)果語句如下:
SELECT * FROM #Test FOR XML PATH
在查詢結(jié)果中會(huì)出現(xiàn)一個(gè)可點(diǎn)擊的XML鏈接,點(diǎn)擊后結(jié)果如下:
<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 可以將查詢后結(jié)果根據(jù)行輸出成XML格式。那么變?yōu)閄ML格式有什么好處呢?我們一般在使用select 列 from 表
語句時(shí)查詢出來的結(jié)果都是按照列輸出的,如果要得到列中的一個(gè)數(shù)據(jù)就需要加各種篩選條件。而XML格式可以通過<>中的節(jié)點(diǎn)來篩選出數(shù)據(jù),從而由select語句的列級(jí)別操作變?yōu)轭愃朴贓xcel基于行列定位的單元格級(jí)別操作
FOR XML PATH應(yīng)用
1.分組拼接
如果要顯示所有人的愛好的結(jié)果集,并且要每個(gè)人的所有興趣顯示在一行中,代碼如下:
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
結(jié)果如下:
對(duì)上述語句逐步分析一下,首先看這句:
SELECT ','+Hobby FROM #Test WHERE Name=T.Name FOR XML PATH('')
這句是通過FOR XML PATH 將某一姓名如張三的愛好,顯示成格式為:“ ,愛好1,愛好2,愛好3,…”的格式,WHERE Name=T.Name這一個(gè)條件用來判斷篩選對(duì)應(yīng)姓名的愛好,如果沒有WHERE Name=T.Name這一個(gè)條件的話就會(huì)連接整個(gè)表中所有的愛好,無法分組
接著用STUFF函數(shù)將拼接完成后字符第一個(gè)’,'替換成空,STUFF函數(shù)第一個(gè)參數(shù)為要操作的字符串,第二個(gè)為從第幾個(gè)開始替換下標(biāo)從1開始,第三個(gè)參數(shù)為替換的個(gè)數(shù),第四個(gè)參數(shù)為替換的字符)
簡(jiǎn)單舉幾個(gè)例子:
select STUFF('abc',1,1,'*') 執(zhí)行結(jié)果為:*abc
select STUFF('abc',1,0,'*') 執(zhí)行結(jié)果為:*bc
select STUFF('abc',2,2,'*') 執(zhí)行結(jié)果為:a**
最終輸出上述按照姓名分組后每個(gè)人對(duì)應(yīng)的愛好
在MySQL 中可以用group_concat這個(gè)函數(shù)來實(shí)現(xiàn)這一功能
多行數(shù)據(jù)拼接
FOR XML PATH可以實(shí)現(xiàn)對(duì)一列中多行數(shù)據(jù)進(jìn)行拼接,可以使用行節(jié)點(diǎn)與列節(jié)點(diǎn)并自定義輸出格式:
-- 還可以通過符號(hào)+號(hào)來對(duì)字符串類型字段的輸出格式進(jìn)行修改
SELECT '[ '+Hobby+' ]' FROM #Test FOR XML PATH('')
--輸出結(jié)果為: [ 唱歌 ][ 睡覺 ][ 爬山 ][ 游戲 ][ 游泳 ]
--如有其他數(shù)據(jù)類型的列轉(zhuǎn)換成字符串類型再拼接
SELECT '{'+STR(ID)+'}','[ '+Hobby+' ]' FROM #Test FOR XML PATH('')
JSON格式輸出
STUFF結(jié)合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": "游泳"}]
節(jié)點(diǎn)名稱的修改
再來看一下如何改變XML行節(jié)點(diǎn)名稱,如果我們想修改對(duì)應(yīng)數(shù)據(jù)的節(jié)點(diǎn)名稱,代碼如下:
SELECT * FROM #Test FOR XML PATH('MyHobby')
運(yùn)行后輸出結(jié)果把原來的行節(jié)點(diǎn) 變成了在PATH后面括號(hào)()中自定義的名稱,結(jié)果如下:
<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>
那么列節(jié)點(diǎn)如何改變呢?可以使用關(guān)鍵字AS修改列節(jié)點(diǎn)名稱,代碼如下:
SELECT Name as 'MyName',Hobby as 'MyHobby' FROM #Test FOR XML PATH('MyHobby')
結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-819275.html
<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.zghlxwxcb.cn/news/detail-819275.html
到了這里,關(guān)于FOR XML PATH 函數(shù)與同一分組下的字符串拼接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!