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), @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')
相關文章
- sql server日期比較SQLServer
- SQL Server對比兩字串的相似度(函式演算法)SQLServer字串函式演算法
- 如何實現“比較兩張圖片的相似度”,或者說“比較兩張圖片是否基本一致”的演算法?演算法
- SQL server 與Oracle開發比較SQLServerOracle
- DB2 和SQL Server自增列比較DB2SQLServer
- SQL Server 2005 功能比較 和 限制SQLServer
- sql server中對日期欄位值的比較SQLServer
- 在SQL SERVER中實現RSA加密演算法SQLServer加密演算法
- SQL Server約束和DML觸發器的比較SQLServer觸發器
- 常見資料庫SYBASE和SQL SERVER的比較資料庫SQLServer
- C#比較兩個字串的相似度【轉】C#字串
- oracle sql日期比較:OracleSQL
- SQL Server資料庫匯入匯出資料方式比較SQLServer資料庫
- Oracle與SQL Server在企業應用中的比較(轉)OracleSQLServer
- 手工實現整除除法的比較
- SQL Server中檢索語句中Like的演算法實現 (轉)SQLServer演算法
- 不同DBMS的SQL比較SQL
- SQL Server資料匯入匯出技術概述與比較(轉)SQLServer
- 實現saas多租戶方案比較
- 如何比較版本號--Python實現Python
- PostgreSQL與Rust的聚合實現比較SQLRust
- js實現的圖片相似度演算法程式碼JS演算法
- 排序演算法效能比較排序演算法
- 影像相似度比較和檢測影像中的特定物
- java中利用hanlp比較兩個文字相似度的步驟JavaHanLP
- 影象相似度比較和檢測影象中的特定物
- Sql server中時間查詢的一個比較快的語句(轉)SQLServer
- 前端動畫效果實現的簡單比較前端動畫
- NLP 中文形近字相似度演算法開源實現演算法
- [SQL Server]分頁功能的實現SQLServer
- Delphi中字串比較大小 VS Oracle-SQL中字串比較大小字串OracleSQL
- 相容oracle的edit_distance_similarity 比較兩個字串相似度OracleMILA字串
- 一些比較常見的SQL Server擴充套件儲存過程SQLServer套件儲存過程
- 比較Windows和Linux SQL容器WindowsLinuxSQL
- 各大排序演算法的Objective-C實現以及圖形化演示比較排序演算法Object
- 如何實現不完全字典比較的 helper
- linux防火牆實現技術比較(轉)Linux防火牆
- ISAPI 與CGI 的 比 較 及 其 實 現 (轉)API