SQL Server字符串聚合拼接辦法


網上搜了一圈還是有不錯的方法的,比如STUFF函數,我們可以這么寫得到上面的結果:

SELECT [TYPE], STUFF( ( SELECT ','+ [Name] FROM test b WHERE b.Type = a.Type FOR XML PATH('')),1 ,1, '') [Names] from Test a group by [TYPE]

最近在項目中遇到個問題,需要將表中某列字段合並成字符串輸出,如果直接通過代碼全部讀取出來,再遍歷進行拼接顯然不是最好的方法,所以想着能否在數據讀取的時候直接拼接好返回,網上搜了可通過for xml來實現。

  首先,准備好需要的數據,腳本如下:  
復制代碼

if exists (select * from sysObjects where id=object_id('Student'))
drop table Student
go

create table Student
(
Id int,
Name varchar(20)
)

go
insert into Student values(1,‘張三’);
insert into Student values(2,‘李四’);
insert into Student values(3,‘王五’);
復制代碼

 當前表中數據如下:

 需要將Name以“張三;李四;王五”格式顯示。

 具體通過實現如下:  

select stuff((
select ';'+name
from Student for xml path('')),1,1,'') as name

 乍一看,是不是有點迷糊,不急,下面我們一一道來。

 上面語句我們分為兩部分來看,首先要明白for xml path的用法,在SQL SERVER中我們有很多方法讀取XML字段中的片段,反過來SQL SERVER也允許我們將表數據以XML方式顯示,for xml path便是以xml顯示的一種方式。  

  select ';'+name
from Student for xml path('')

 這段代碼就是告訴數據庫服務器要將生成的XML中name值以“;”方式進行拼接。

   更多可參考:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html

    其次,我們理解stuff函數的用法,通過上述代碼拼接生成的內容為“;張三;李四;王五”,顯然最前的“;”是多余的,所以我們通過stuff來去除。

 STUFF(string,insert position,delete count,string inserted)函數是將一個字符串插入到另一個字符串中。插入時,插入的字符串可能刪除指定數量的字符。

 第一個參數string,指的就是你要操作的內容,可以是一個固定字符串,也可以指定為某列;

 第二個參數insert position,指插入開始位置,SQLSERVER中默認是從1開始,而非從0開始;

 第三個參數delete count,指的是要刪除的字符個數,從position刪除指定的個數,如果count為0表示不刪除;

 第四個參數string inserted,表示要插入的字符串;

    eg:select  stuff('abcdefg',3,2,'123')

 結果:ab123efg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM