if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_sql]') and xtype in (n'fn', n'if', n'tf'))
drop function [dbo].[f_sql]
goif exists (select * from dbo.sysobjects where id = object_id(n'[序數表]') and objectproperty(id, n'isusertable') = 1)
drop table [序數表]
go--為了效率,所以要乙個輔助表配合
select top 1000 id=identity(int,1,1) into 序數表
from syscolumns a,syscolumns b
alter table 序數表 add constraint pk_id_序數表 primary key(id)
go/*--根據指定字串生成查詢的模糊匹配字串
條件連線的關鍵字為 and,or
可以任意指定括號
生成的條件表示式為 like 模糊匹配
--鄒建 2004.08(引用請保留此資訊)--*/
/*--呼叫示例
--呼叫示例
select a=dbo.f_sql('(web or html or internet) and (programmer or developer)','content')
select b=dbo.f_sql('web or html or internet','content')
select c=dbo.f_sql('(web and html)','content')
select d=dbo.f_sql('web','content')
--*/
--示例函式
create function f_sql(
@str nvarchar(1000), --要檢索的字串
@fdname sysname --在那個欄位中檢索
)returns nvarchar(4000)
asbegin
declare @r nvarchar(4000)
set @r=''
select @r=@r+case
when substring(@str,id,charindex(' ',@str+' ',id)-id) in('or','and')
then ' '+substring(@str,id,charindex(' ',@str+' ',id)-id)+' '
when substring(@str,id,1)='('
then '(['+@fdname+'] like ''%'
+substring(@str,id+1,charindex(' ',@str+' ',id)-id-1)
+'%'''
when substring(@str,charindex(' ',@str+' ',id)-1,1)=')'
then '['+@fdname+'] like ''%'
+substring(@str,id,charindex(' ',@str+' ',id)-id-1)
+'%'')'
else '['+@fdname+'] like ''%'
+substring(@str,id,charindex(' ',@str+' ',id)-id)
+'%'''
endfrom 序數表
where id<=len(@str)
and charindex(' ',' '+@str,id)-id=0
return(@r)
endgo
關於字串模糊匹配
一種比kmp和bm 更高效的匹配演算法 如果想看原英文介紹,看下面分割線後的 適用於 模式串較短的情況,最壞時間複雜性為o n m 不過一般沒這麼壞 sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如...
字串模糊匹配 根據萬用字元
在我們程式設計過程中,經常需要遇到字串和指定的模板匹配,需要返回是否匹配字串模板。其中符號 匹配任意多個位元組,匹配單個字元 模板形式舉例如下 1 010 010?用於判斷 號碼是否是010開頭。2 民主 用於判斷文字中是否含有敏感詞。3 銀行 信用卡 用於判斷文字中是否含有特殊的語義。我們需要用文...
C 實現的字串模糊匹配
c 基本沒有正規表示式功能,當然像boost裡提供了正則。本文 於園友的一篇文章,請看 很早之前就看過這篇文章,原作者的需求很明確 實現也很好。之所以又寫這篇文章,是因為原作者只介紹了在linux系統下直接呼叫系統函式fnmatch即可實現,而沒有考慮在windows在的使用。本人這週看了下goog...