今天在工作中遇到如下這個問題,需要將如下的查詢結果,拼接成一行!
1 select PERSON_NAME from S_PROJECT_MEMBER where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049';
先直接上代碼吧!-------------------------有問題的,麻煩指出--------------------------------------------------------
select CAST(stuff(( select distinct ','+PERSON_NAME from S_PROJECT_MEMBER where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049' for xml path('')),1,1,'') AS varchar(1000) ) AS PERSON_NAMES from S_PROJECT_MEMBER where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049' GROUP BY PROJECT_ID;
這里用的知識點有:
for xml path() 函數:
--這里用來做字符串拼接
CAST()函數:
--CAST函數用於將某種數據類型的表達式顯式轉換為另一種數據類型 cast( "abcdefg" as varchar(2000));
STUFF()函數:
--STUFF()函數用於刪除指定長度的字符,並可以在制定的起點處插入另一組字符。 --select stuff(列名,開始位置,長度,替代字符串)
DISTINCT 關鍵字:
--這里可以理解為去重,具體可以百度
AS 關鍵字:
--取別名
GROP BY :
--用於分組
下面通過具體的例子來說明吧: 來自於:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html
create table hobby( hobbyId varchar(32), hName varchar(32) ) insert into hobby values('1','爬山'); insert into hobby values('2','游泳'); insert into hobby values('3','爬山');
--將查詢結果根據行輸出成XML格式 SELECT * FROM hobby FOR XML PATH;
--改變XML行節點的名稱 SELECT * FROM hobby FOR XML PATH('MyHobby');
--改變XML列節點的名稱 SELECT hobbyID as 'MyCode',hName as 'MyName' FROM hobby FOR XML PATH('MyHobby');
--構建我們喜歡的輸出方式 SELECT '[ '+hName+' ]' FROM hobby FOR XML PATH('');
現在我對例子進行應用:
--應用 select distinct ','+hobbyId from hobby for xml path('');
-- for xml path('') 解決連接問題 select hName,(select distinct '+'+hobbyId from hobby h where h.hName = hName for xml path('')) AS A from hobby group by hName;
-- stuff(String,1,1,'') 去除開始的連接符 +1+2+3 --> 1+2+3 select hName,stuff((select distinct '+'+hobbyId from hobby for xml path('')),1,1,'') AS A from hobby group by hName;
--需要查詢結果
'爬山' '1'+'3'
'游泳' '2'
--方法一 select hName,stuff((select distinct '+'+hobbyId from hobby where hName = B.hName for xml path('')),1,1,'') AS A from hobby B group by hName;
--方法二 SELECT B.hName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT hName, (SELECT hobbyId+',' FROM hobby WHERE hName=A.hName FOR XML PATH('')) AS StuList FROM hobby A GROUP BY hName ) B
結果:
第一次寫筆記。。。。。2016.06.25

