SQL Server 如何合併組內字串

xiaohuihui發表於2020-05-27

就是在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中的難題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2694657/,如需轉載,請註明出處,否則將追究法律責任。

相關文章