首页 > 代码库 > SQL Server对比两字段的相似度(函数算法)
SQL Server对比两字段的相似度(函数算法)
原文:SQL Server对比两字段的相似度(函数算法)
相似度函数
概述
比较两个字段的相似度
最近有人问到关于两个字段求相似度的函数,所以就写了一篇关于相似度的函数,分别是“简单的模糊匹配”,“顺序匹配”,“一对一位置匹配”。在平时的这种函数可能会需要用到,可能业务需求不一样,这里只给出参照,实际情况可以相对修改。
本文所有的两个字段比较都是除以比较字段本身,例如A与B比较,找出的长度除以A的长度,因为考虑如果A的长度大于B的长度,相似度会超100%,例如‘abbc’,‘ab‘.
如果大家想除以B的长度,只需要在语句末尾将‘SET @num=@num*1.0/LEN(@Cloumna)’修改成‘SET @num=@num*1.0/LEN(@Cloumnb)’
步骤
1.两个字段简单相似
---两个字段简单相似CREATE FUNCTION DBO.FN_Resemble (@Cloumna NVARCHAR(MAX), @Cloumnb NVARCHAR(MAX) )RETURNS FLOATASBEGIN DECLARE @num FLOAT,@len int SET @Cloumna=ISNULL(@Cloumna,0) SET @Cloumnb=ISNULL(@Cloumnb,0) SET @len=1 SET @num=0 WHILE(LEN(@Cloumna)<>0 AND LEN(@CloumnB)<>0) BEGIN WHILE(@len<=LEN(@Cloumna)) BEGIN DECLARE @a NVARCHAR(4) SET @a=‘‘ SET @a=SUBSTRING(@Cloumna,@len,1) IF(CHARINDEX(@a,@CloumnB)>0) BEGIN SET @num=@num+1 END SET @len=@len+1 END SET @num=@num*1.0/LEN(@Cloumna) BREAK END RETURN @numEND----测试代码SELECT DBO.FN_Resemble(‘ABDC321G‘,‘ABDC123G‘)
2.两个字段顺序相似
---两个字段顺序相似CREATE FUNCTION DBO.FN_Resemble_order (@Cloumna NVARCHAR(MAX), @Cloumnb NVARCHAR(MAX) )RETURNS FLOATASBEGIN DECLARE @num FLOAT,@len int SET @Cloumna=ISNULL(@Cloumna,0) SET @Cloumnb=ISNULL(@Cloumnb,0) SET @len=1 SET @num=0 WHILE(LEN(@Cloumna)<>0 AND LEN(@CloumnB)<>0) BEGIN DECLARE @a NVARCHAR(4) DECLARE @b NVARCHAR(4) IF(LEN(@Cloumna)>=LEN(@CloumnB)) BEGIN WHILE(@len<=LEN(@CloumnB)) BEGIN SET @a=‘‘ SET @a=SUBSTRING(@Cloumna,@len,1) SET @b=‘‘ SET @b=SUBSTRING(@CloumnB,@len,1) IF(@a=@b) BEGIN SET @num=@num+1 END ELSE BEGIN break END SET @len=@len+1 END END ELSE IF (LEN(@Cloumna)<LEN(@CloumnB)) BEGIN WHILE(@len<=LEN(@Cloumna)) BEGIN SET @a=‘‘ SET @a=SUBSTRING(@Cloumna,@len,1) SET @b=‘‘ SET @b=SUBSTRING(@CloumnB,@len,1) IF(@a=@b) BEGIN SET @num=@num+1 END ELSE BEGIN break END SET @len=@len+1 END END SET @num=@num*1.0/LEN(@Cloumna) BREAK END RETURN @numENDgo----测试代码SELECT DBO.FN_Resemble_order(‘ABDC456G‘,‘ABDC123G‘)
3.两个字段一对一相似
---两个字段一对一相似CREATE FUNCTION DBO.FN_Resemble_onebyone (@Cloumna NVARCHAR(MAX), @Cloumnb NVARCHAR(MAX) )RETURNS FLOATASBEGIN DECLARE @num FLOAT,@len int SET @Cloumna=ISNULL(@Cloumna,0) SET @Cloumnb=ISNULL(@Cloumnb,0) SET @len=1 SET @num=0 WHILE(LEN(@Cloumna)<>0 AND LEN(@CloumnB)<>0) BEGIN DECLARE @a NVARCHAR(4) DECLARE @b NVARCHAR(4) IF(LEN(@Cloumna)>=LEN(@CloumnB)) BEGIN WHILE(@len<=LEN(@CloumnB)) BEGIN SET @a=‘‘ SET @a=SUBSTRING(@Cloumna,@len,1) SET @b=‘‘ SET @b=SUBSTRING(@CloumnB,@len,1) IF(@a=@b) BEGIN SET @num=@num+1 END SET @len=@len+1 END END ELSE IF (LEN(@Cloumna)<LEN(@CloumnB)) BEGIN WHILE(@len<=LEN(@Cloumna)) BEGIN SET @a=‘‘ SET @a=SUBSTRING(@Cloumna,@len,1) SET @b=‘‘ SET @b=SUBSTRING(@CloumnB,@len,1) IF(@a=@b) BEGIN SET @num=@num+1 END SET @len=@len+1 END END SET @num=@num*1.0/LEN(@Cloumna) BREAK END RETURN @numEND----测试代码SELECT DBO.FN_Resemble_onebyone(‘ABDC456G‘,‘ABDC123G‘)
总结
如果大家觉得文章对大家有帮助,麻烦给个推荐,谢谢。
备注: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。 《欢迎交流讨论》 |
SQL Server对比两字段的相似度(函数算法)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。