最简单的方法

loen113 2011-02-28 10:58:17
表A

名称 字1 字2 字3 描述
张三 A1,B2,C3
李四 A1,B2,D4
王五 E5,C3
得如下
名称 字1 字2 字3 描述
张三 C3 B2 A1 A1,B2,C3
李四 D4 B2 A1 A1,B2,D4
王五 C3 E5 E5,C3

我能想到的是游标,能不能不用游标呢
...全文
52 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
loen113 2011-03-18
已经解决。都没有用到各位方法。我的方法比各位简单些呵呵。分分给各位
回复
liang145 2011-03-01

create table #TryKK(名称 nvarchar(10), 字1 nvarchar(10), 字2 nvarchar(10), 字3 nvarchar(10), 描述 nvarchar(50))
insert #TryKK select '张三','','','',' A1,B2,C3' union all
select '李四' ,'','','','A1,B2,D4' union all
select '王五','','','','E5,C3'

alter function [dbo].[m_split](@c varchar(2000),@split varchar(2)) --把字符串截開,生成一個單列的表
returns @t table(id int,col varchar(200))
as
begin
declare @i as int
set @i=1
while(charindex(@split,@c)<>0)
begin
insert @t(id,col) values (@i,substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
set @i=@i+1
end
insert @t(id,col) values (@i,@c)
return
end

select 名称,字1=(select col from [dbo].[m_split](描述,',') where id=(select max(id) from [dbo].[m_split](描述,',')))
,字2=(select col from [dbo].[m_split](描述,',') where id=(select max(id) from [dbo].[m_split](描述,','))-1)
,字3=(select col from [dbo].[m_split](描述,',') where id=(select max(id) from [dbo].[m_split](描述,','))-2)
,描述
from #TryKK
回复
-晴天 2011-02-28
create table 表A(名称 nvarchar(10),字1 nvarchar(10),字2 nvarchar(10),字3 nvarchar(10),描述 nvarchar(30))
insert into 表A(名称,描述) select '张三','A1,B2,C3'
insert into 表A(名称,描述) select '李四','A1,B2,D4'
insert into 表A(名称,描述) select '王五','E5,C3'
go
;with c1 as(
select 名称,(case when len(replace(描述,',',''))=len(描述)-1 then ' ,'+描述 else 描述 end) as tmp from 表A
),c2 as(
select 名称,left(tmp,charindex(',',tmp)-1) as z1,right(tmp,len(tmp)-charindex(',',tmp))tmp from c1
),c3 as(
select 名称,z1,left(tmp,charindex(',',tmp)-1) as z2,right(tmp,len(tmp)-charindex(',',tmp))tmp from c2
)
update 表A set 字1=b.tmp,字2=b.z2,字3=b.z1 from 表A a inner join c3 b on a.名称=b.名称
go
select * from 表A
/*
名称 字1 字2 字3 描述
---------- ---------- ---------- ---------- ------------------------------
张三 C3 B2 A1 A1,B2,C3
李四 D4 B2 A1 A1,B2,D4
王五 C3 E5 E5,C3

(3 行受影响)

*/
go
drop table 表A
回复
-晴天 2011-02-28
create table 表A(名称 nvarchar(10),字1 nvarchar(10),字2 nvarchar(10),字3 nvarchar(10),描述 nvarchar(30))
insert into 表A(名称,字1,字2,字3) select '张三','A1','B2','C3'
insert into 表A(名称,字1,字2,字3) select '李四','A1','B2','D4'
insert into 表A(名称,字1,字2) select '王五','E5','C3'
go
update 表A set 描述=isnull(字3+',','')+isnull(字2+',','')+isnull(字1,'')
select * from 表A
/*
名称 字1 字2 字3 描述
---------- ---------- ---------- ---------- ------------------------------
张三 A1 B2 C3 C3,B2,A1
李四 A1 B2 D4 D4,B2,A1
王五 E5 C3 NULL C3,E5

(3 行受影响)
*/
go
drop table 表A
回复
loen113 2011-02-28
没有空格,就用下划线代替
名称 字1 字2 字3 描述
张三____________ A1,B2,C3
李四____________ A1,B2,D4
王五_____________ E5,C3
得如下
名称 字1 字2 字3 描述
张三 C3 B2 A1 A1,B2,C3
李四 D4 B2 A1 A1,B2,D4
王五 C3 E5 E5,C3
回复
loen113 2011-02-28
哎呀,怎么没有空格了
名称 字1 字2 字3 描述
张三 A1,B2,C3
李四 A1,B2,D4
王五 E5,C3
得如下
名称 字1 字2 字3 描述
张三 C3 B2 A1 A1,B2,C3
李四 D4 B2 A1 A1,B2,D4
王五 C3 E5 E5,C3

回复
loen113 2011-02-28
没注意到空格不好意思应该是这样的
名称 字1 字2 字3 描述
张三 A1,B2,C3
李四 A1,B2,D4
王五 E5,C3
得如下
名称 字1 字2 字3 描述
张三 C3 B2 A1 A1,B2,C3
李四 D4 B2 A1 A1,B2,D4
王五 C3 E5 E5,C3

回复
-晴天 2011-02-28
如要更新,则:
update 表A set 描述=isnull(字3,'')+','+isnull(字2,'')+','+isnull(字1,'')
回复
-晴天 2011-02-28
select *,字3+','+字2+','+字1 as 描述 from 表A
这是在各字段不填时为空串时的写法,如果为NULL,则:
select *,isnull(字3,'')+','+isnull(字2,'')+','+isnull(字1,'') as 描述 from 表A
回复
-晴天 2011-02-28
select *,字3+','+字2+','+字1 as 描述 from 表A
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2011-02-28 10:58
社区公告
暂无公告