t_id t_flag
1 24,25,26
2 24,26,45,56
3 12,24,56
4 11,75,86
5 14,75,84
查找t_flag中有24的数据集合,正确得结果为
t_id t_flag
1 24,25,26
2 24,26,45,56
3 12,24,56
或者在t_flag有56的数据集合,正确结果为
2 24,26,45,56
3 12,24,56
如下是我的实现方法(不知道是否还有更好得方法,望指点)
1.把t_flag字段中的数据用‘,’分割,取得长度,该函数来自网络
CREATE function Get_StrArrayLength
(
@str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location <>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end
----
CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start)
end
---------------
CREATE procedure pro_test
(@t_id int)
as
begin
declare @temp table
( tid int,
tflag varchar(100))
declare @num int,@nflag varchar(200)
declare @next int,@str_input varchar(100),@length int
declare cur1 cursor
for select * from T_Test
open cur1
fetch cur1 into @num,@nflag
select * from dbo.T_Test
while @@fetch_status=0
begin
set @next=1
set @str_input=@t_id
set @length=dbo.Get_StrArrayLength(@nflag,',')
while @next<=@length
begin
if @str_input=dbo.Get_StrArrayStrOfIndex(@nflag,',',@next)
begin
insert into @temp values(@num,@nflag)
set @next=@next+1
end
else
set @next=@next+1
end
fetch next from cur1 into @num,@nflag
end
close cur1
DEALLOCATE cur1
select * from @temp
end
GO