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 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

获取订阅

填写您的常用邮件地址,免费订阅《快乐码农》



微博推荐

@WEB开发家园 上面有很多WEB前端的资源以及最新的IT新闻

@程序员大联盟 里面主要是一些程序员相关的热门话题,偶尔也有一些幽默和时评内容

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/49335.html

更多阅读

如何配置SQL Server 2008管理器 sqlserver2008配置

如何配置SQL Server 2008管理器——简介SQl Server 配置管理器(简称为配置管理器)包含了SQL Server 2008服务、SQL Server 2008网络配置和SQL Native Client配置3个工具,供数据库管理人员做服务器启动停止与监控、服务器端支持的网络协

sql server 2008 r2安装详解 sqlserver2008r2 64位

sql server 2008 r2安装详解——简介本篇文章为大家介绍了安装sql server 2008 安装图解,里面有详细步骤,以及需要注意的事项,希望能帮助有需要的朋友。一、进入安装程序插入SQL Server 2008 R2安装光盘,自动运行后出现“SQL Server

SQL Server SQL触发器经验详解 sqlserver 触发器调试

【SQL Server】SQL触发器经验详解——简介自从上次在经验中使用了触发器,有读者询问我一些关于触发器的相关信息,个人推荐首先你需要先去把触发器最基础的东西了解清楚,然后通过这次的经验,希望能在你理解的基础上,加深你对触发器的了解,

SQL Server如何导入mdf,ldf文件 mdf导入sql server

SQL Server如何导入mdf,ldf文件——简介在平时开发中,经常会遇到数据库SQL Server如导入mdf,ldf文件的问题,下面给你介绍一下怎么做,希望能够帮到你。SQL Server如何导入mdf,ldf文件——工具/原料SQL Servermdf,ldf文件SQL Server如何导

SQL Server游标语句 声明/打开/循环 sqlserver 循环语句

网上搜到一篇介绍SqlServer数据库游标的用法,感觉言简意赅,粘过来跟大家分享一下:SQL Server游标语句使用方法:1 1 --声明一个游标2 2 DECLARE MyCursor CURSOR3 3 FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo//定义一个叫M

声明:《SQL Server相似比较算法实现 – 码农网 码农网网盘地址》为网友树上的向日葵分享!如侵犯到您的合法权益请联系我们删除