SQL 比较中文字符串

/*
declare @str1 varchar(200),@str2 varchar(200)
set @str1=N'江西省南昌市其它区高新区火炬大道809号' 
set @str2=N'江西省南昌市其它区高新区火炬大道809号'

*/
ALTER FUNCTION [dbo].[F_strcompare](@str1 nVARCHAR(200),
                             @str2 nVARCHAR(200))
RETURNS numeric(3,2)
AS
BEGIN
declare @returnvalue numeric(3,2)
set @returnvalue=0
if len(@str1)=0 or LEN(@str2)=0
begin
	return @returnvalue
end     

/*完全相等与完全包含*/
if @str1=@str2 or charindex(@str1,@str2)>0 or charindex(@str2,@str1)>0
begin
	set @returnvalue= 1.0
	return @returnvalue 
end

DECLARE	@len   INT,	--长度
		@min	int,
		  @pos   INT, --累计符合个数 
		  @currindex int,	--上次匹配位置
		  @index	int,	--本次匹配位置
		  @k   INT,
		  @ret numeric(3,1),	--相似度
		  @word	nvarchar(200),	--进行分解的字符串
		  @strsource	nvarchar(200)	--长度较大的字符串
		  
select @pos=0,@index=0,@currindex=0,@k=0

select @len =(
		case when LEN(@str1)>LEN(@str2)
			then LEN(@str1)
			else
				LEN(@str2)
				end
		),
		@min=(
		case when LEN(@str1)>LEN(@str2)
			then LEN(@str2)
			else
				LEN(@str1)
				end
		)
		,@word=(
			case when LEN(@str1)>LEN(@str2)
				then @str2
				else
					@str1
					end
		)
		,@strsource=(
			case when LEN(@str1)>LEN(@str2)
				then @str1
				else
					@str2
					end
		)
		
 while   @k   <  @len-1
  begin   
		select @index=charIndex(substring(@word,@k,1),@strsource)
          if  @index >   0 and @index > @currindex
                begin   
                    set   @pos   =   @pos+1     
                    set   @currindex=@index
                    --print @index
                end   
          set   @k=@k+1   
  end   
  
  --SET @ret = (CAST(@pos * 100.0 / @k AS NUMERIC(3, 0)))
  SET @ret= (@pos * 1.0 / @min)
  return @ret
End
  --select @ret,@k,@pos,@len,@min
  
  
  
  

  

原文地址:https://www.cnblogs.com/gxivwshjj/p/3653896.html