2012-07-10 131 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