網站首頁 編程語言 正文
一、實現
#tmp表內容如下:
實現group_concat的sql語句為:
Select
RegionID,
STUFF(
(
SELECT ',' + T.c1
FROM #tmp T
WHERE A.regionid = T.regionid
FOR XML PATH('')
), 1, 1, ''
) as group_concat
FROM #tmp A
Group by RegionID
實現效果如下:
二、原理分析
2.1、FOR?XML?PATH的作用
FOR?XML?PATH?的作用是將查詢結果集以XML形式展現,將多行的結果,展示在同一行,例如:
select c1 from #tmp where RegionID = 41653
其結果集如下:
select c1 from #tmp where RegionID = 41653 FOR XML PATH('')
當sql語句加上?FOR?XML?PATH('')?后,其結果集輸出是:
具體輸出的字符如下:
<c1>30.326809</c1><c1>30.327982</c1><c1>30.347933</c1><c1>30.388104</c1><c1>30.392830</c1><c1>30.367931</c1><c1>30.368052</c1><c1>30.367842</c1><c1>30.357318</c1><c1>30.357349</c1><c1>30.357349</c1>
通過字符拼接后可以把xml信息清除,并以指定的字符進行分割:
select ',' + c1 from #tmp where RegionID = 41653 FOR XML PATH('')
此時已基本達到group_concat的效果,但第一個字符串有分隔符需要去掉。
2.2、STUFF函數
2.2.1、STUFF函數在本SQL的作用
我們使用STUFF函數的目的是把第一個分隔符去掉。先看看效果:
上圖可以看到,STUFF函數把字符串“abcdefg”中的第一個字符“a”刪除。
使用該函數我們可以很輕松的把上圖得到的結果集去掉第一個逗號分隔符:
需要詳細了解STUFF函數可繼續看該函數的語法,沒興趣的可以忽略。
2.2.2、STUFF函數語法
STUFF函數的作用是將字符串插入到另一個字符串中。它從第一個字符串的開始位置刪除指定長度的字符,然后將第二個字符串插入到第一個字符串的開始位置。其語法為:
STUFF(character_expression , start , length , replaceWith_expression)
character_expression:字符數據的表達式,可以是常量、變量,也可以是字符列或二進制數據列。
start:一個整數值(從1開始),指定刪除和插入的開始位置。start的類型可以是bigint。
??如果?start?為負或為零,則返回空字符串。
??如果?start?的長度大于第一個?character_expression,則返回空字符串。?
length:一個整數,指定要刪除的字符數。length的類型可以是?bigint。
??如果?length?為負,則返回空字符串。
??如果?length?的長度大于character_expression,則最多可以刪除到character_expression?中的最后一個字符。
??如果?length?為零,則不刪除字符直接在指定位置插入內容。?
replaceWith_expression:字符數據的表達式,可以是常量、變量,也可以是字符列或二進制數據列。此表達式從?start?開始替換?length?個字符的character_expression。
??如果?replaceWith_expression?為?NULL,則在不插入任何內容的情況下刪除字符。
2.3、sql語分分析
2.3.1、一個簡單的group?by
Select RegionID
FROM #tmp A
Group by RegionID
這個sql各位看官都十分熟悉,已經沒什么好說的了。
2.3.2、在select語句后面加上子查詢
Select RegionID,
(
SELECT ',' + T.c1
FROM #tmp T
WHERE A.regionid = T.regionid
FOR XML PATH('')
)
FROM #tmp A
Group by RegionID
在上述簡單的group?by語句基礎上加入一個select里的子查詢,其結果如下:
在該子查詢中,當外層的group?by返回結果集中的第一行RegionID為41653時,這個值被子查詢的where條件所使用,相當于:
SELECT ',' + T.c1
FROM #tmp T
WHERE T.regionid = 41653
FOR XML PATH('')
因為FOR?XML?PATH把多行記錄打平成一條記錄,因此此時的返回結果為:
接著第group?by返回結果集中的第二行45761傳入該子查詢,依次類似上面描述的執行,直到所有外層的值遍歷完成。
2.3.3、去掉子查詢結果集的第一個分隔符
Select
RegionID,
STUFF(
(
SELECT ',' + T.c1
FROM #tmp T
WHERE A.regionid = T.regionid
FOR XML PATH('')
), 1, 1, ''
) as group_concat
FROM #tmp A
Group by RegionID
利用STUFF函數,去掉了第一個逗號,完成了最終sql語句。
總結
原文鏈接:https://blog.csdn.net/mysqltop/article/details/124252173
相關推薦
- 2022-09-18 Rust實現grep命令行工具的方法_相關技巧
- 2022-07-22 Redis主從復制關系實現(Linux系統)
- 2022-01-09 Echarts|Stacked Line Chart(折線圖堆疊)Y軸數據不正確問題
- 2022-07-15 python優雅實現代碼與敏感信息分離的方法_python
- 2022-08-12 Python?Pandas?中的數據結構詳解_python
- 2022-09-16 numpy.reshape(-1,1)的具體使用_python
- 2022-03-14 window環境編譯在linux環境運行的golang程序
- 2022-09-16 Pandas缺失值刪除df.dropna()的使用_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支