SQL 將乙個欄位內用逗號分隔的內容分成多條記錄

2021-09-06 07:48:24 字數 2214 閱讀 4922

---恢復內容開始---

本文轉由於業務需求,我們可能會把一串以分割符字串資料放到乙個字段,如我們在客戶端處理拆分是很簡單的,不過這樣做效果不太好,怎麼用sql server 2008 來解決這件事件哪?

--參考 

拆分表: 

--> --> (roy)生成測試資料 

if not object_id(

'tab') 

isnull

drop table tab 

go create table tab([col1] 

int,[col2] nvarchar(

5)) 

insert tab 

select

1,n '

a,b,c

' union all 

select

2,n '

d,e' union all 

select

3,n 'f'

go 

sql2000用輔助表: 

if object_id(

'tempdb..#num

')  is not 

null

drop table #num 

go select top 

100 id=identity(

int,

1,1) into #num 

from syscolumns a,syscolumns b 

select  

a.col1,col2=substring(a.col2,b.id,charindex(

',',a.col2+

',',b.id)-b.id)  

from

tab a,#num b 

where

charindex(

',',

','+a.col2,b.id)=b.id --也可用 substring(

','+a.col2,b.id,

1)=','

sql2005用xml: 

select

a.col1,b.col2 

from

( select col1,col2=convert(xml,

''+replace(col2,

',',

'')+ '

')  from tab)a 

(select col2=c.v.value(

'.',

'nvarchar(100)

')  from a.col2.nodes(

'/root/v

')c(v))b 

sql05用cte: 

;with roy 

as( select col1,col2=cast(left(col2,charindex(

',',col2+

',')-

1) as nvarchar(

100)),split=cast(stuff(col2+

',',

1,charindex(

',',col2+

','),

'') 

as nvarchar(

100)) 

from tab 

union all 

select col1,col2=cast(left(split,charindex(

',',split)-

1) as nvarchar(

100)),split= cast(stuff(split,

1,charindex(

',',split),

'') 

as nvarchar(

100)) 

from roy 

where split>

'') 

select col1,col2 

from roy order by col1 option (maxrecursion 

0) 生成結果: 

/*col1        col2 

----------- ----- 

1           a 

1           b 

1           c 

2           d 

2           e 

3           f 

*/

乙個字段匹配的sql語句書寫

新的一年開始了,首先向大家拜個年,祝大家過年好!這幾天負責乙個家教門戶 的開發,基於cakephp框架。在培訓機構表 schools 中存在乙個欄位subject用來儲存另乙個資料表 subjects 中記錄的id值,且儲存形式為 1,2,3,4,5 但是在應用高階搜尋過濾時頁面select選項op...

mysql多表乙個字段

先執行這三個 show variables like group concat max len 查詢大小 set global group concat max len 10240000 設定大小滿足執行後能夠存放所有的插入語句 set session group concat max len 10...

mysql乙個欄位為空時使用另乙個字段排序

表中有兩個日期欄位createdate,updatedate。其中updatedate可以為空,要求使用updatedate排序,如果updatedate為空則使用createdate排序,結果要順序排下來。按照常規方法 這樣的結果是為空的資料排在了最下面,不符合要求。這樣試試 這樣排的結果是先按u...