在线等待:关于一个字符串的函数
假如:
table1 包含 字段1,字段1里面的纪录如下
---------------
select 字段1 form table1
字段1纪录列表:
1. a
2. a,2345345,xzf,ddd
3. 23,xxx
4. cc
5. asdf,aii23
......
现在:
变量 a = "a,cc,xxx,sdfas,23dsdf,asdfasdf,345asdfa,23452345,sdasdfxxxxz"
能否做个函数,该函数实现的功能是
只要 字段1 中 包含 变量 a 里面的任意一个词组,就将该纪录列表出来?
问题点数:20、回复次数:7Top
1 楼sankis()回复于 2004-08-02 14:01:48 得分 0
是要完全 匹配的吗?Top
2 楼notin(Not iN)回复于 2004-08-02 14:04:46 得分 0
关注中~~~Top
3 楼tx1icenhe(冒牌马可 V0.4)回复于 2004-08-02 14:11:58 得分 15
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_split]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_split]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[序数表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [序数表]
GO
--为了效率,所以要一个辅助表配合
select top 8000 id=identity(int,1,1) into 序数表
from syscolumns a,syscolumns b
alter table 序数表 add constraint pk_id_序数表 primary key(id)
go
/*--字符串分函数
分拆指定分隔符的的字符串,返回结果表
--邹建 2004-4--*/
/*--调用示例
--调用
select * from f_split('asdlkfa,asf as,dd a',',')
--*/
create function f_split(
@str varchar(8000), --要分拆的字符串
@splitchar varchar(10) --分隔符
)returns table
as
return(
select re=substring(@str,id,charindex(@splitchar,@str+@splitchar,id)-id)
from 序数表
where id<=len(@str)+1 and charindex(@splitchar,@splitchar+@str,id)-id=0
)
go
--调用
declare @a varchar(2000)
set @a = "a,cc,xxx,sdfas,23dsdf,asdfasdf,345asdfa,23452345,sdasdfxxxxz"
select 字段1 form table1 a,dbo.f_split(@a,',') b
where ','+a.字段1+',' like '%,'+b.re+',%'
Top
4 楼v2boy(大格)回复于 2004-08-02 14:13:40 得分 0
不是完全匹配,而是部分匹配。
比如上例中。如果变量
a = "ccc,d$xx"
就没有记录出来
但是如果 a = "23" 就要把第 3 条记录列表出来
如果 a = "a,243523524,asdfasfasdfadsf"
就要把 第 1、2 条记录列表出来Top
5 楼XiaoyunCheng(程晓云)回复于 2004-08-02 14:17:05 得分 0
第一步:用chaindex()把变量a从","分组,存入变量n1,n2…中;
第二步:依据n1,n2等筛选结果集;
如果是完全匹配请用charindex(),否则用patindex()。Top
6 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-02 14:20:21 得分 0
先试试吧
Top
7 楼zhangzs8896(小二)回复于 2004-08-02 17:09:32 得分 5
冒牌的测试通过^_^
create table tb(字段1 varchar(100))
insert tb values('a')
insert tb values('a,2345345,xzf,ddd')
insert tb values('23,xxx')
insert tb values('cc')
insert tb values('asdf,aii23')
declare @a varchar(2000)
set @a = 'a,23'
select 字段1 from tb a,dbo.f_split(@a,',') b
where ','+a.字段1+',' like '%,'+b.re+',%'
drop table tb
--结果
字段1
----------------------------------------------------------------------------------------------------
a
a,2345345,xzf,ddd
23,xxx
Top




