查詢結果集合成一列的sqlserver實現方法stuff

  • 2019 年 10 月 30 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/luo4105/article/details/51778698

我有個需求如下圖

表的結構關係

網上找了一下資料,發現可以用stuff+for xml path('')

for xml path('')的作用是將字元串先拼成一個

 SELECT  		*,  		RLCD = (select ',' + RLCD from WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD for xml path('')),  		RLNM=(select ',' + RLNM from WQ_ROLE_B WHERE RLCD IN(SELECT RLCD FROM WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD) for xml path(''))  	FROM  		WQ_USER_B

得到的結果如下,但出現一個小問題,就是前面會多出一個","號,如下圖

這時,可以用stuff()去除逗號

關於STUFF的介紹 STUFF ( character_expression , start , length ,character_expression ) 參數 character_expression 一個字元數據表達式。character_expression 可以是常量、變數,也可以是字元列或二進位數據列。 start 一個整數值,指定刪除和插入的開始位置。如果 start 或 length 為負,則返回空字元串。如果 start 比第一個 character_expression 長,則返回空字元串。start 可以是 bigint 類型。 length 一個整數,指定要刪除的字元數。如果 length 比第一個 character_expression 長,則最多刪除到最後一個 character_expression 中的最後一個字元。length 可以是 bigint 類型。 返回類型 如果 character_expression 是受支援的字元數據類型,則返回字元數據。如果 character_expression 是一個受支援的 binary 數據類型,則返回二進位數據。 備註 如果開始位置或長度值是負數,或者如果開始位置大於第一個字元串的長度,將返回空字元串。如果要刪除的長度大於第一個字元串的長度,將刪除到第一個字元串中的第一個字元。 如果結果值大於返回類型支援的最大值,則產生錯誤。

我只要把第一個字元串改成空字元串就可以了,程式碼如下

 SELECT  		*,  		RLCD = (select ',' + RLCD from WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD for xml path('')),  		RLNM=stuff((select ',' + RLNM from WQ_ROLE_B WHERE RLCD IN(SELECT RLCD FROM WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD) for xml path('')) , 1 , 1 , '')  	FROM  		WQ_USER_B

這樣就得到了我想要的結果,大功告成