相似度函数
概述
最近有人问到关于两个字段求相似度的函数,所以就写了一篇关于相似度的函数,分别是“简单的模糊匹配”,“顺序匹配”,“一对一位置匹配”。在平时的这种函数可能会需要用到,可能业务需求不一样,这里只给出参照,实际情况可以相对修改。
本文所有的两个字段比较都是除以比较字段本身,例如A与B比较,找出的长度除以A的长度,因为考虑如果A的长度大于B的长度,相似度会超100%,例如‘abbc’,‘ab‘.
如果大家想除以B的长度,只需要在语句末尾将‘ SET @num=@num*1.0/LEN(@Cloumna)’修改成‘SET @num=@num*1.0/LEN(@Cloumnb)’
步骤
1.两个字段简单相似
--
-两个字段简单相似
ALTER
FUNCTION
DBO.FN_Resemble
(
@Cloumna
NVARCHAR(MAX),
@CloumnbNVARCHAR(MAX)
)
RETURNSFLOATASBEGINDECLARE@numFLOAT,@lenintSET@Cloumna=ISNULL(@Cloumna,0)
SET@Cloumnb=ISNULL(@Cloumnb,0)
SET@len=1SET@num=0WHILE(LEN(@Cloumna)<>0ANDLEN(@CloumnB)<>0)
BEGINWHILE(@len<=LEN(@Cloumna))
BEGINDECLARE@aNVARCHAR(4)
SET@a=‘‘SET@a=SUBSTRING(@Cloumna,@len,1)
IF(CHARINDEX(@a,@CloumnB)>0)
BEGINSET@num=@num+1ENDSET@len=@len+1ENDSET@num=@num*1.0/LEN(@Cloumna)
BREAKENDRETURN@numEND----测试代码SELECT DBO.FN_Resemble(‘ABDC321G‘,‘ABDC123G‘)
2.两个字段顺序相似
--
-两个字段顺序相似
CREATE
FUNCTION
DBO.FN_Resemble_order
(
@Cloumna
NVARCHAR(MAX),
@CloumnbNVARCHAR(MAX)
)
RETURNSFLOATASBEGINDECLARE@numFLOAT,@lenintSET@Cloumna=ISNULL(@Cloumna,0)
SET@Cloumnb=ISNULL(@Cloumnb,0)
SET@len=1SET@num=0WHILE(LEN(@Cloumna)<>0ANDLEN(@CloumnB)<>0)
BEGINDECLARE@aNVARCHAR(4)
DECLARE@bNVARCHAR(4)
IF(LEN(@Cloumna)>=LEN(@CloumnB))
BEGINWHILE(@len<=LEN(@CloumnB))
BEGINSET@a=‘‘SET@a=SUBSTRING(@Cloumna,@len,1)
SET@b=‘‘SET@b=SUBSTRING(@CloumnB,@len,1)
IF(@a=@b)
BEGINSET@num=@num+1ENDELSEBEGINbreakENDSET@len=@len+1ENDENDELSEIF (LEN(@Cloumna)<LEN(@CloumnB))
BEGINWHILE(@len<=LEN(@Cloumna))
BEGINSET@a=‘‘SET@a=SUBSTRING(@Cloumna,@len,1)
SET@b=‘‘SET@b=SUBSTRING(@CloumnB,@len,1)
IF(@a=@b)
BEGINSET@num=@num+1ENDELSEBEGINbreakENDSET@len=@len+1ENDENDSET@num=@num*1.0/LEN(@Cloumna)
BREAKENDRETURN@numENDgo----测试代码SELECT DBO.FN_Resemble_order(‘ABDC456G‘,‘ABDC123G‘)
3.两个字段一对一相似
--
-两个字段一对一相似
CREATE
FUNCTION
DBO.FN_Resemble_onebyone
(
@Cloumna
NVARCHAR(MAX),
@CloumnbNVARCHAR(MAX)
)
RETURNSFLOATASBEGINDECLARE@numFLOAT,@lenintSET@Cloumna=ISNULL(@Cloumna,0)
SET@Cloumnb=ISNULL(@Cloumnb,0)
SET@len=1SET@num=0WHILE(LEN(@Cloumna)<>0ANDLEN(@CloumnB)<>0)
BEGINDECLARE@aNVARCHAR(4)
DECLARE@bNVARCHAR(4)
IF(LEN(@Cloumna)>=LEN(@CloumnB))
BEGINWHILE(@len<=LEN(@CloumnB))
BEGINSET@a=‘‘SET@a=SUBSTRING(@Cloumna,@len,1)
SET@b=‘‘SET@b=SUBSTRING(@CloumnB,@len,1)
IF(@a=@b)
BEGINSET@num=@num+1ENDSET@len=@len+1ENDENDELSEIF (LEN(@Cloumna)<LEN(@CloumnB))
BEGINWHILE(@len<=LEN(@Cloumna))
BEGINSET@a=‘‘SET@a=SUBSTRING(@Cloumna,@len,1)
SET@b=‘‘SET@b=SUBSTRING(@CloumnB,@len,1)
IF(@a=@b)
BEGINSET@num=@num+1ENDSET@len=@len+1ENDENDSET@num=@num*1.0/LEN(@Cloumna)
BREAKENDRETURN@numEND----测试代码SELECT DBO.FN_Resemble_onebyone(‘ABDC456G‘,‘ABDC123G‘)
总结
如果大家觉得文章对大家有帮助,麻烦给个推荐,谢谢。
|
备注: 作者: pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站点所有文章都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。 欢迎大家拍砖 |
原文:http://www.cnblogs.com/chenmh/p/3967913.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!