结合两个 UDF,您可以返回搜索的命中率(百分比)。
例如
Select [dbo].[udf-Str-Match-Rate]('Dog,House,Custom',',','The dog house is red',' ')
返回 0.6666 -- 找到 3 个单词/短语中的 2 个。
每个都可以有自己的分隔符
只测试不同的词以避免夸大结果
我还包括了一个 soundex(这是可选的)
第一个UDF是独立的,可以独立使用。
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
-- Select * from [dbo].[udf-Str-Parse]('id26,id46|id658,id967','|')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1) NOT NULL , Key_Value varchar(max))
As
Begin
Declare @intPos int,@SubStr varchar(max)
Set @IntPos = CharIndex(@delimeter, @String)
Set @String = Replace(@String,@delimeter+@delimeter,@delimeter)
While @IntPos > 0
Begin
Set @SubStr = Substring(@String, 0, @IntPos)
Insert into @ReturnTable (Key_Value) values (@SubStr)
Set @String = Replace(@String, @SubStr + @delimeter, '')
Set @IntPos = CharIndex(@delimeter, @String)
End
Insert into @ReturnTable (Key_Value) values (@String)
Return
End
第二个 UDF 需要第一个
CREATE FUNCTION [dbo].[udf-Str-Match-Rate] (@SearchFor varchar(max),@SearchForDelim varchar(5),@SearchIn varchar(max),@SearchInDelim varchar(5))
-- Syntax : Select [dbo].[udf-Str-Match-Rate]('Dog,House,Custom',',','The dog house is red',' ')
Returns money
AS
BEGIN
Declare @RetVal money
;with cteSearchFor as (Select Distinct Key_Value from [dbo].[udf-Str-Parse](@SearchFor ,@SearchForDelim))
,cteSearchIn as (Select Distinct Key_Value from [dbo].[udf-Str-Parse](@SearchIn,@SearchInDelim))
,cteWordCnt as (Select Words=cast(count(*) as money) From cteSearchFor)
Select @RetVal = isnull(Count(*)/max(Words),0)
From cteSearchFor S
Join cteWordCnt W on 1=1
Join cteSearchIn C
on S.Key_Value = C.Key_Value
or Soundex(S.Key_Value) = Soundex(C.Key_Value)
Return @RetVal
END