有时在设计数据库时,为了效率的考虑,不得不违反数据库的设计范式。这时在查询时可能遇到麻烦。此文就是为了解决此类问题的。
此文为<<以"x1,x2,x3,x4"方式的查询>>(2008-08-04 17:04 )的改进。
-- Gu Laicheng 2012.1.15
-- 在F0001中查找F0002,如找到则返回"1",否则返回"0"
-- 如果F0001="_ALL_",表示所有,则返回1
alter function gSeek(@F0001 varchar(200),@F0002 varchar(200))
returns bit
as
begin
declare @ret bit
select @ret=
case
when @F0001='_ALL_' then 'true'
when (patindex('%|'+rtrim(@F0002)+'|%','|'+replace(rtrim(@F0001),',','|')+'|')>0) then 'true'
else 'false'
end
return @ret
end
declare @F0001 varchar(200)
declare @F0002 varchar(200)
select @F0001='AA,CC,DD'
select @F0002='BB'
select
case
when @F0001='_ALL_' then 'true'
when (patindex('%|'+rtrim(@F0002)+'|%','|'+replace(rtrim(@F0001),',','|')+'|')>0) then 'true'
else 'false'
end
select dbo.gSeek(@F0001,@F0002)
select * from dbo.Table1
id a b c
1 2 2,3,4 4
2 5 _ALL_ 5
3 4 5,6,7 6
4 3 1,2,3 2
select * from dbo.Table1 where dbo.gSeek(b,a)=1
id a b c
1 2 2,3,4 4
2 5 _ALL_ 5
4 3 1,2,3 2