按照 , 或者特定的字符进行分割,把值取出来,举个例子,数据是:
a,b,c
d,e,f
显示结果是:
a
b
c
d
e
f
解决方法:
拆分表:
if
not
object_id(
'Tab'
)
is
null
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)=','
--2000不使用辅助表
Select
a.Col1,COl2=
substring
(a.Col2,b.number,charindex(
','
,a.Col2+
','
,b.number)-b.number)
from
Tab a
join
master..spt_values b
ON
B.type=
'p'
AND
B.number
BETWEEN
1
AND
LEN(A.col2)
where
substring
(
','
+a.COl2,b.number,1)=
','
SQL2005用Xml:
select
a.COl1,b.Col2
from
(
select
Col1,COl2=
convert
(xml,
'<root><v>'
+
replace
(COl2,
','
,
'</v><v>'
)+
'</v></root>'
)
from
Tab)a
outer
apply
(
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
*/
方法:
if
not
object_id(N
'Tempdb..#T'
)
is
null
drop
table
#T
Go
Create
table
#T([Col1] nvarchar(9))
Insert
#T
select
N
'苹果/橘子/梨'
union
all
select
N
'香蕉/鸭蛋/巧克力'
union
all
select
N
'饼干/果粒橙'
Go
Select
substring
(a.[Col1],b.number,charindex(
'/'
,a.[Col1]+
'/'
,b.number)-b.number)
from
#T
AS
a,master.dbo.spt_values
AS
b
WHERE
b.type=
'P'
AND
CHARINDEX(
'/'
,
'/'
+[Col1],b.number)=b.number