将包含分号的字段值拆分成多条记录
2010-05-04 20:47
204 查看
将包含分号的字段值拆分成多条记录
xx,yy,zz三个字段中的内容如果分号分隔的个数相同(以xx字段为基准),则按先后顺序拆分记录,如果分号分隔的个数与xx字段不同的,则按xx字段的分隔的个数拆分记录,与其个数不等的原样不变
drop table #aa
go
create table #aa(xx varchar(200),yy varchar(200),zz varchar(200))
insert #aa
select '1;2;3','好;中;差','山东;北京;上海'
union all
select '4;5','好;中','广东;河南;安徽'
union all
select '6;7;8','中;差','江西;河北;湖南'
union all
select '9','差','湖北'
union all
select '10;11','好;差','福建;青海'
go
--> 显示原数据
select * from #aa
/*原数据
xx yy zz
-------------------------------------------
1;2;3 好;中;差 山东;北京;上海
4;5 好;中 广东;河南;安徽
6;7;8 中;差 江西;河北;湖南
9 差 湖北
10;11 好;差 福建;青海
(5 行受影响)
*/
--> 代码实现
declare @temp table(xx int,yy varchar(20),zz varchar(20)) --> 创建临时表来存储结果
declare @xx varchar(20),@yy varchar(20),@zz varchar(20),@x varchar(20),@y varchar(20),@z varchar(20)
declare my_cursor cursor for select * from #aa --> 声明游标
open my_cursor
fetch next from my_cursor into @xx,@yy,@zz
while @@fetch_status=0
begin
declare @a varchar(20),@b varchar(20),@c varchar(20)
select @a=@xx,@b=@yy,@c=@zz
while(len(@xx)>0)
begin
if charindex(';',@xx)>0
begin
if len(@a)-len(replace(@a,';',''))<>len(@b)-len(replace(@b,';',''))
select @x=left(@xx,(charindex(';',@xx)-1)),@y=@yy
else
select @x=left(@xx,charindex(';',@xx)-1),@y=left(@yy,charindex(';',@yy)-1),@yy=stuff(@yy,1,charindex(';',@yy),'')
if len(@a)-len(replace(@a,';',''))<>len(@c)-len(replace(@c,';',''))
select @x=left(@xx,charindex(';',@xx)-1),@z=@zz
else
select @x=left(@xx,charindex(';',@xx)-1),@z=left(@zz,charindex(';',@zz)-1),@zz=stuff(@zz,1,charindex(';',@zz),'')
insert into @temp select @x,@y,@z
set @xx=stuff(@xx,1,charindex(';',@xx),'')
end
else
begin
insert into @temp select @xx,@yy,@zz
set @xx=''
end
end
fetch next from my_cursor into @xx,@yy,@zz
end
deallocate my_cursor
--> 显示结果数据
select * from @temp
/*结果数据
xx yy zz
-------------------------------
1 好 山东
2 中 北京
3 差 上海
4 好 广东;河南;安徽
5 中 广东;河南;安徽
6 中;差 江西
7 中;差 河北
8 中;差 湖南
9 差 湖北
10 好 福建
11 差 青海
(11 行受影响)
*/
xx,yy,zz三个字段中的内容如果分号分隔的个数相同(以xx字段为基准),则按先后顺序拆分记录,如果分号分隔的个数与xx字段不同的,则按xx字段的分隔的个数拆分记录,与其个数不等的原样不变
drop table #aa
go
create table #aa(xx varchar(200),yy varchar(200),zz varchar(200))
insert #aa
select '1;2;3','好;中;差','山东;北京;上海'
union all
select '4;5','好;中','广东;河南;安徽'
union all
select '6;7;8','中;差','江西;河北;湖南'
union all
select '9','差','湖北'
union all
select '10;11','好;差','福建;青海'
go
--> 显示原数据
select * from #aa
/*原数据
xx yy zz
-------------------------------------------
1;2;3 好;中;差 山东;北京;上海
4;5 好;中 广东;河南;安徽
6;7;8 中;差 江西;河北;湖南
9 差 湖北
10;11 好;差 福建;青海
(5 行受影响)
*/
--> 代码实现
declare @temp table(xx int,yy varchar(20),zz varchar(20)) --> 创建临时表来存储结果
declare @xx varchar(20),@yy varchar(20),@zz varchar(20),@x varchar(20),@y varchar(20),@z varchar(20)
declare my_cursor cursor for select * from #aa --> 声明游标
open my_cursor
fetch next from my_cursor into @xx,@yy,@zz
while @@fetch_status=0
begin
declare @a varchar(20),@b varchar(20),@c varchar(20)
select @a=@xx,@b=@yy,@c=@zz
while(len(@xx)>0)
begin
if charindex(';',@xx)>0
begin
if len(@a)-len(replace(@a,';',''))<>len(@b)-len(replace(@b,';',''))
select @x=left(@xx,(charindex(';',@xx)-1)),@y=@yy
else
select @x=left(@xx,charindex(';',@xx)-1),@y=left(@yy,charindex(';',@yy)-1),@yy=stuff(@yy,1,charindex(';',@yy),'')
if len(@a)-len(replace(@a,';',''))<>len(@c)-len(replace(@c,';',''))
select @x=left(@xx,charindex(';',@xx)-1),@z=@zz
else
select @x=left(@xx,charindex(';',@xx)-1),@z=left(@zz,charindex(';',@zz)-1),@zz=stuff(@zz,1,charindex(';',@zz),'')
insert into @temp select @x,@y,@z
set @xx=stuff(@xx,1,charindex(';',@xx),'')
end
else
begin
insert into @temp select @xx,@yy,@zz
set @xx=''
end
end
fetch next from my_cursor into @xx,@yy,@zz
end
deallocate my_cursor
--> 显示结果数据
select * from @temp
/*结果数据
xx yy zz
-------------------------------
1 好 山东
2 中 北京
3 差 上海
4 好 广东;河南;安徽
5 中 广东;河南;安徽
6 中;差 江西
7 中;差 河北
8 中;差 湖南
9 差 湖北
10 好 福建
11 差 青海
(11 行受影响)
*/
相关文章推荐
- SQL 多条记录整合到一个字段 一个字段拆分多条记录
- 循环SQL语句实现,将一个数字字段的商数拆分成多条记录
- Oracle中将一条记录(某字段中为合并的信息)拆分成多条记录
- C#以逗号拆分字符串,若字段中包含逗号(备注:包含逗号的字段必须有双引号引用)则对其进行拼接处理
- MySQL数据库将多条记录的单个字段合并成一条记录
- MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
- MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
- SQL 将一个字段内用逗号分隔的内容分成多条记录
- SQL 拼接多个字段的值&一个字段多条记录的拼接
- mysql同时更新多条记录的同一个字段
- C#以逗号拆分字符串,若字段中包含逗号(备注:包含逗号的字段必须有双引号引用)则对其进行拼接处理
- MySQL数据库将多条记录的单个字段…
- Oracle中将一个字段拆分成多个行记录
- mysql批量更新多条记录的同一个字段为不同值的方法
- 根据某个字段将多条记录的某个字段拼接成一个字段(SQL查询)
- sql语句一条记录拆分为多条记录
- MySQL数据库将多条记录的单个字段合并成一条记录
- --查出多条记录中两个字段都相同的重复记录
- MySQL数据库将多条记录的单个字段合并成