就是在SQL SERVER實現類似MYSQL中group_concat函式的功能,把分組中的字串拼接起來。SQL Server 2017可以用STRING_AGG函式實現,比如SELECT G, STRING_AGG(S, ',') FROM T GROUP BY G(按表T的G欄位分組,組內S欄位拼接起來);
但2016版沒有STRING_AGG函式,就會麻煩很多:
SELECT p2.G, SS = JSON_VALUE( REPLACE( (SELECT _ = p1.S FROM T p1 WHERE p1.G = p2.G FOR JSON PATH) ,'"},{"_":"',', '),'$[0]._' ) FROM T p2 |
SQL Server 2014需要3層巢狀來合併組內字串,還得藉助XML,程式碼看起來非常複雜:
SELECT Main.G, LEFT(Main.SS,Len(Main.SS)-1) As "SS" FROM ( SELECT DISTINCT p2.G, ( SELECT p1.S + ',' AS [text()] FROM T p1 WHERE p1.G = p2.G ORDER BY p1.G FOR XML PATH ('') )[SS] FROM T p2 )[Main] |
其他版本的SQL Server寫法雖然各有不同,但通常也很複雜。
當資料庫沒有類似group_concat這樣的函式時,可以用esProc協助實現,程式碼會簡單很多。同樣針對2014版SQL Server,esProc可以這樣合併組內字串:
|
A | B |
1 | =db.query("select G, S from T") | /query from SQL Server 2014 |
2 | =A1.group(G; ~.(S).concat(",")) | /用逗號合併多行 |
這樣就可以實現類似group_concat的功能了,而且任何資料庫上都可以用。
esProc是個指令碼語言,可以在IDE裡反覆執行,還可以用命令列方式呼叫,適合簡化SQL中的難題。