2012-07-10 66 views
1

拆分列值到不同的列我有臺試驗作爲我怎麼可以在SQL

col_1 
---------- 
aa,ab,ac 
ba,bb,bc 
ca,cb,cc 

我想輸出

col_1  col_2 col_3 
------------------------- 
aa  ab  ac 
ba  bb  bc 
ca  cb  cc 
+0

該列是否總是隻包含3個兩個字符組? – 2012-07-10 07:01:42

回答

0
declare @T table 
(
    col_1 varchar(100) 
) 

insert into @T values 
('aa,ab,ac,4,5,6,7,8,9,10'), 
('ba,bb,bc,4,5,6,7,8,9,10'), 
('ca,cb,cc,4,5,6,7,8,9,10') 

select left(T.col_1, C1.Pos-1) as col_1, 
     substring(T.col_1, C1.Pos+1, C2.Pos-C1.Pos-1) as col_2, 
     substring(T.col_1, C2.Pos+1, C3.Pos-C2.Pos-1) as col_3, 
     substring(T.col_1, C3.Pos+1, C4.Pos-C3.Pos-1) as col_4, 
     substring(T.col_1, C4.Pos+1, C5.Pos-C4.Pos-1) as col_5, 
     substring(T.col_1, C5.Pos+1, C6.Pos-C5.Pos-1) as col_6, 
     substring(T.col_1, C6.Pos+1, C7.Pos-C6.Pos-1) as col_7, 
     substring(T.col_1, C7.Pos+1, C8.Pos-C7.Pos-1) as col_8, 
     substring(T.col_1, C8.Pos+1, C9.Pos-C8.Pos-1) as col_9, 
     stuff(T.col_1, 1, C9.Pos, '') as col_10 
from @T as T 
    cross apply (select charindex(',', col_1)) as C1(Pos) 
    cross apply (select charindex(',', col_1, C1.Pos+1)) as C2(Pos) 
    cross apply (select charindex(',', col_1, C2.Pos+1)) as C3(Pos) 
    cross apply (select charindex(',', col_1, C3.Pos+1)) as C4(Pos) 
    cross apply (select charindex(',', col_1, C4.Pos+1)) as C5(Pos) 
    cross apply (select charindex(',', col_1, C5.Pos+1)) as C6(Pos) 
    cross apply (select charindex(',', col_1, C6.Pos+1)) as C7(Pos) 
    cross apply (select charindex(',', col_1, C7.Pos+1)) as C8(Pos) 
    cross apply (select charindex(',', col_1, C8.Pos+1)) as C9(Pos) 
+0

嘿,感謝您的答覆,但我有10個值與逗號分隔,那我該如何使用它? – 2012-07-13 06:02:02

+0

只需添加更多列。 – 2012-07-13 06:19:21

+0

Hey thnx Mikael – 2012-07-13 08:46:35

0
select substring(col_1,1,CHARINDEX(',',col_1,1)-1) as col_1, 
substring(col_1,(CHARINDEX(',',col_1,1)+1),CHARINDEX(',',col_1,CHARINDEX(',',col_1,1)+1)-(CHARINDEX(',',col_1,1)+1)) as col_2, 
substring(col_1,CHARINDEX(',',col_1,CHARINDEX(',',col_1,1)+1)+1,LEN(col_1)) as col_3 
from test 
+0

'ROW_NUMBER()over(order by(select 0))'不能保證爲相同的原始行生成相同的行號。 – 2012-07-10 07:42:47

+0

@Damien_The_Unbeliever:同意你,謝謝..在幾分鐘內編輯我的答案 – 2012-07-10 07:47:17

+0

@Damien_The_Unbeliever:我已經更新了我的查詢,請現在chaeck – 2012-07-10 07:56:16

0

您可以使用一個函數來split字符串和代碼將看起來像

選擇dbo.Split(col_1,',')從測試

0

嗨,如果有固定的列數,那麼我們可以使用下面的查詢。

DECLARE @col TABLE(col_1 varchar(255)) 

INSERT INTO @col 
values('aa,ab,ac'),('ba,bb,bc'),('ca,cb,cc') 

select * from @col 

select LEFT(col_1,CHARINDEX(',',col_1,1)-1) as col_1, 
LEFT(RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)),CHARINDEX(',',RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)),1)-1) as col_2, 
RIGHT(col_1,2) as col_3 
from @col 
0

即使超過2個字符用逗號分隔,以下是解決方案。

DECLARE @col TABLE(col_1 varchar(255)) 

INSERT INTO @col 
values('aa,ab,ac'),('ba,bb,bc'),('ca,cb,cc') 

select * from @col 

select LEFT(col_1,CHARINDEX(',',col_1,1)-1) as col_1, 
LEFT(RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)),CHARINDEX(',',RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)),1)-1) as col_2, 
RIGHT(RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)),LEN(RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)))-CHARINDEX(',',RIGHT(col_1,len(col_1)-CHARINDEX(',',col_1,1)),1)) as col_3 

from @col