亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL Server對比兩字段的相似度(函數算法)

系統 4859 0
原文: 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
      
      
        FLOAT
      
      
        AS
      
      
        BEGIN
      
      
        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
      
      
        @num
      
      
        END
      
      
        --
      
      
        --測試代碼
      
      
        SELECT
      
       DBO.FN_Resemble(
      
        '
      
      
        ABDC321G
      
      
        '
      
      ,
      
        '
      
      
        ABDC123G
      
      
        '
      
      )
    

?

2.兩個字段順序相似

      
        --
      
      
        -兩個字段順序相似
      
      
        CREATE
      
      
        FUNCTION
      
      
         DBO.FN_Resemble_order

    (
      
      
        @Cloumna
      
      
        NVARCHAR
      
      (
      
        MAX
      
      
        ),

     
      
      
        @Cloumnb
      
      
        NVARCHAR
      
      (
      
        MAX
      
      
        )

    )


      
      
        RETURNS
      
      
        FLOAT
      
      
        AS
      
      
        BEGIN
      
      
        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
      
      
        @num
      
      
        END
      
      
        go
      
      
        --
      
      
        --測試代碼
      
      
        SELECT
      
       DBO.FN_Resemble_order(
      
        '
      
      
        ABDC456G
      
      
        '
      
      ,
      
        '
      
      
        ABDC123G
      
      
        '
      
      )
    

?

?

3.兩個字段一對一相似

?

      
        --
      
      
        -兩個字段一對一相似
      
      
        CREATE
      
      
        FUNCTION
      
      
         DBO.FN_Resemble_onebyone

    (
      
      
        @Cloumna
      
      
        NVARCHAR
      
      (
      
        MAX
      
      
        ),

     
      
      
        @Cloumnb
      
      
        NVARCHAR
      
      (
      
        MAX
      
      
        )

    )


      
      
        RETURNS
      
      
        FLOAT
      
      
        AS
      
      
        BEGIN
      
      
        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
      
      
        @num
      
      
        END
      
      
        --
      
      
        --測試代碼
      
      
        SELECT
      
       DBO.FN_Resemble_onebyone(
      
        '
      
      
        ABDC456G
      
      
        '
      
      ,
      
        '
      
      
        ABDC123G
      
      
        '
      
      )
    

?

總結

?? 如果大家覺得文章對大家有幫助,麻煩給個推薦,謝謝。

?

備注:

??? 作者: pursuer.chen

??? 博客: http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

SQL Server對比兩字段的相似度(函數算法)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美高清一区二区 | 波多野给衣一区二区三区 | 国产精品免费_区二区三区观看 | 奇米777在线观看 | 久久激情综合色丁香 | 一级毛片在线播放 | 久久毛片免费看一区二区三区 | 九九九国产 | 国产午夜精品福利视频 | 亚洲人成网站在线观看青青 | 天天干人人 | 精品一区二区三区四区乱码90 | 青青青手机视频 | 国产网站麻豆精品视频 | 中文字幕久精品免费视频 | porno日本xxxxx视频| 免费看成人毛片 | 奇米色在线视频 | 国产1769一七六九视频在线 | 精品一区二区三区在线观看视频 | 久久免费视频观看 | 亚洲精品国产v片在线观看 亚洲精品国产啊女成拍色拍 | 一区二区不卡不卡一卡 | 欧美日韩色 | 久久精品3 | 二级毛片免费观看全程 | 美国毛片一级视频在线aa | 香蕉久久a毛片 | 亚洲另类在线视频 | 国产精品第二页 | 久久88 | 九九国产在线观看 | 欧美日韩国产一区二区 | 九九99国产精品视频 | 青青国产成人久久激情911 | 9热在线精品视频观看 | 久久国产网站 | 欧美一区二区三区在线播放 | 欧美性一区二区三区五区 | 国产精品一区二区资源 | 色婷婷综合欧美成人 |