select test from mytable where charindex(',',test)=0 union select left(test,(charindex(',',test)-1)) from mytable where charindex(',',test)>0 union select substring(test,(charindex(',',test)+1),len(test)-charindex(',',test)) from mytable where charindex(',',test,charindex(',',test)+1)=0 and charindex(',',test)>0 union select substring(test,(charindex(',',test)+1),charindex(',',test,charindex(',',test)+1)-charindex(',',test)-1) from mytable where charindex(',',test,charindex(',',test)+1)>0 union select substring(test,charindex(',',test,charindex(',',test)+1)+1,len(test)-charindex(',',test,charindex(',',test)+1)) from mytable where charindex(',',test,charindex(',',test)+1)>0 and charindex(',',test,charindex(',',test,charindex(',',test)+1)+1)=0 --如果更多层就需要更加多的Union --也可使用临时表处理
To XZisgood: 谢谢,分肯定是给加的。 只是我想用SQL就是为了加速,你用循环的方法,就没有什么意思了。
To ded: 这个方法有点勉强,不过也算是一个方法。 呵呵。 可惜SQL不支持递归。To XZisgood: 我还要稍微等一下,看看有没有更好的回答。回头给诸位多加些分。
在Sql server中游标处理办法,DeD的办法属手工处理,灵活性不太高. create procedure splitword as declare @tstr varchar(100) declare c cursor for select * from abc insert into temptb select name from abc where patindex('%,%',name)=0 open c fetch next from c into @tstr while @@fetch_status =0 begin while patindex('%,%',@tstr)>0 begin insert into temptb values(substring(@tstr,1,patindex('%,%',@tstr)-1)) set @tstr=substring(@tstr,patindex('%,%',@tstr)+1,len(@tstr)-patindex('%,%',@tstr)) end fetch next from c into @tstr end select distinct name from temptb order by name close c deallocate c
我有一个不成熟的想法,大家看看可不可行: 利用文本文件进行转换第一步,先把表中的数据输出到一个文本文件中,设定记录之间用逗号(,)隔开;第二步把这个文本文件输入到数据库中的另外一个只有一个字段的表中,设定记录之间的间隔是逗号(,);第三步就是最后的检索了。(手头没有SqlServer,没法实验) 关键是第一步,我记得用SqlServer的工具手动是可以实现的,就是不知道能不能用语句实现,输出文件假设为c:\data.dat。 第二步是可以的,用语句BULK INSERT myTable1 FROM 'c:\data.dat' WITH ( DATAFILETYPE = 'char', ROWTERMINATOR = ',' )最后再对这个新的表进行检索(distingush)
如果用ms sql select test into #test_temp from mytable select test into #temp from mytable where 1=2 while exits (select * from #test_temp ) begin insert into #out select test from #test_temp where where charindex(',',test)=0 insert into #out select substring(0,charindex(',',test)) from #test_temp where charindex(',',test)=0 delete from #temp insert into #temp select substring(0,charindex(',',test)) from #test_temp where charindex(',',test)=0 delete from #test_temp insert into #test_temp select #temp end select distinct * from #out
每个记录可能是一个单一值,也可能是一个字符分隔的值序列。
我要的是用SQL语句分割出所有的单值来。distinct干不了这个活。
union
select left(test,(charindex(',',test)-1)) from mytable where charindex(',',test)>0
union
select substring(test,(charindex(',',test)+1),len(test)-charindex(',',test)) from mytable
where charindex(',',test,charindex(',',test)+1)=0 and charindex(',',test)>0
union
select substring(test,(charindex(',',test)+1),charindex(',',test,charindex(',',test)+1)-charindex(',',test)-1)
from mytable
where charindex(',',test,charindex(',',test)+1)>0
union
select substring(test,charindex(',',test,charindex(',',test)+1)+1,len(test)-charindex(',',test,charindex(',',test)+1))
from mytable
where charindex(',',test,charindex(',',test)+1)>0 and charindex(',',test,charindex(',',test,charindex(',',test)+1)+1)=0
--如果更多层就需要更加多的Union
--也可使用临时表处理
谢谢,分肯定是给加的。
只是我想用SQL就是为了加速,你用循环的方法,就没有什么意思了。
To ded:
这个方法有点勉强,不过也算是一个方法。 呵呵。
可惜SQL不支持递归。To XZisgood:
我还要稍微等一下,看看有没有更好的回答。回头给诸位多加些分。
PS:我觉得你的数据结构设计有问题,为什么要这样设计呢?
create procedure splitword
as
declare @tstr varchar(100)
declare c cursor for select * from abc
insert into temptb select name from abc where patindex('%,%',name)=0
open c
fetch next from c into @tstr
while @@fetch_status =0 begin
while patindex('%,%',@tstr)>0 begin
insert into temptb values(substring(@tstr,1,patindex('%,%',@tstr)-1))
set @tstr=substring(@tstr,patindex('%,%',@tstr)+1,len(@tstr)-patindex('%,%',@tstr))
end
fetch next from c into @tstr
end
select distinct name from temptb order by name
close c
deallocate c
说到设计库,如果是我,不会这样设计,应该搞清楚关键词的个数(一般至多5个),直接给它5个字段岂不更直接,简单?
灵活上的不足,但是会受到ADO(我是用这个东西处理数据库)的相应SQL长度的限制
但是有一点速度上来说上面一种会快一些。
另外,我也不同意对数据库这样的设计,即使是这样,认为还是把数据拿回客户端自己处理
比较方便
关键是第一步,我记得用SqlServer的工具手动是可以实现的,就是不知道能不能用语句实现,输出文件假设为c:\data.dat。
第二步是可以的,用语句BULK INSERT myTable1 FROM 'c:\data.dat'
WITH (
DATAFILETYPE = 'char',
ROWTERMINATOR = ','
)最后再对这个新的表进行检索(distingush)
select test into #test_temp from mytable
select test into #temp from mytable where 1=2
while exits (select * from #test_temp )
begin
insert into #out select test from #test_temp where where charindex(',',test)=0
insert into #out select substring(0,charindex(',',test)) from #test_temp where charindex(',',test)=0
delete from #temp
insert into #temp select substring(0,charindex(',',test)) from #test_temp where charindex(',',test)=0
delete from #test_temp
insert into #test_temp select #temp
end
select distinct * from #out
w102272,对不起,借用了你的地方。先致歉。