[SQL Server][T-SQL]將多筆資料列串接成單一欄位的複合字串

最近的工作中要幫使用者設定大量的系統參數,有陣子沒使用到資料列串接,一時之間失去了她的消息,這年頭忘記的比記得的多,重新拾回後快來點部落筆記,順便二探SQL Server 2016新功能: STRING_SPLIT:字串切割。

 

我們要的結果是下面的資料集

轉換成

German,Spain,France,Italy

 

同場加映SQL Server 2016推出的新table valued function(STRING_SPLIT),逆向轉換,也解決了T-SQL 組IN條件時可能被源碼檢測或程式分析工具檢測到的SQL Injection

 


資料列轉換為逗號分隔字串

 

1.先準備環境

USE tempdb
CREATE TABLE UEFO_Country
(name varchar(30))

insert into UEFO_Country
values ('German'),('Spain'),('France'),('Italy')

 

ok!我們有了4個歐洲有舉辦歐冠小組賽的國家資料集

2.串接多筆資料列的語法(久不見若影,何竟日默默在此)

declare   @String varchar(8000)
select     @String = isnull(@String + ',', '') + cast(name as varchar(30)) 
FROM     UEFO_Country
select     @String

執行結果:

完成多筆資料列的串接~

 


複合字串拆解為多筆資料列

找回來舊愛,也要好好認識新歡,SQL Server 2016立馬內建: 複合字串切割

SELECT * 
FROM STRING_SPLIT('England,Spain,Japan', ',')

 

輕鬆拆解

上面的國家名單是明年要旅行的地點,如果我們想要知道歐冠舉辦小組賽地點國家中,哪一個是我們明年剛好和旅行的?

好!來解決T-SQL IN條件用程式組字串出來的作法,直接用STRING_SPLIT串成資料集

SELECT NAME FROM UEFO_Country
WHERE NAME IN(SELECT * 
FROM STRING_SPLIT('England,Spain,Japan', ',')
)

 

執行結果:

唯一支持西班牙!

 


小結:

  • SQL Server 2016內建支援STRING_SPLIT,也可以用逗號、用分隔符號、用空白來拆解。
  • 該出國旅行了。