当前位置:首页 > 数据库 > Sqlserver

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.两个字段简单相似

 

            --
            -两个字段简单相似
            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)!