不知道你的相似度判断的规则是什么,通过数据库实现的话,可以考虑定义一个相似度比较函数,然后在update时调用并判断,下面是MSSQL的思路,不过需要把相似度判断的函数写完整。 其他数据库应该也可以用相同思路来做吧。 FUNCTION fn_GetSimilar ( @strA As Varchar(255), --传入的待比较的字符 @StrB As Varchar(255 --期望字符 ) RETURNS int AS BEGIN DECLARE @Result int; if @strA= @StrB begin set @Result=100 end ---- --相似度判断条件及判断方法赋值 ---- RETURN @Result END 如果函数测试没问题,就可以调用下面的方法来修改了 update 不规则名称表 set StdMedName=b.CommonName from 标准名称表 b where dbo.fn_GetSimilar( 不规则名称表.IrrMedName,b.CommonName)>相似度的值
追问
比较字符函数需要从IrrMedName字段中选出一条记录依次与StdMedName字段中的记录作比较,这个应该要用循环的吧?可不可以直接对字段操作了? 相似度的判断规则是这样的:比如不规则名称‘阿卡米星’和标准名称‘阿米卡星’按照每个字符来算,就是‘阿’‘米’‘卡’‘星’。总的相符的字符为100% 如果我设定某一个相似度值75%,只要大于这个值就更新。主要是这里面涉及到字符串的拆分与计算不太会。希望你给我点思路。谢谢!
回答
我记得有个函数可以把字符串插入到表的函数,我想可以通过函数处理,稍等,我整理一下看看: 通过fn_splitstr将字符串分割为单个字符的表,通过计算相同字符数目来计算匹配度,调用可以测试: select dbo.fn_getsimilar('asdf','fdsa') --以下是创建函数脚本 create FUNCTION [dbo].[fn_splitstr] ( @splitString varchar(8000) ) returns @T table ( splitValue varchar(8000) ) AS begin declare @charStr varchar(8000), @index bigint, @splitLength int set @splitString = ltrim((rtrim(@splitString))) set @index = 0 set @splitLength= len(@splitString) while(@index<=@splitLength) begin set @charStr = right(left(@splitString, @index),1) if @charStr<>'' insert into @T values(@charStr) set @index = @index+1 end return; end create FUNCTION fn_GetSimilar ( @StrA As Varchar(255), --传入的待比较的字符 @StrB As Varchar(255) --期望字符 ) RETURNS int AS BEGIN DECLARE @Result int declare @lenA int declare @lenB int declare @lenSameA int declare @lenSameB int set @lenA=len(@StrA) set @lenB=len(@StrB) --计算A中字符在B中存在的数量 select @lenSameA=count(*) from dbo.fn_splitstr(@strA) where @StrB like '%'+splitValue+'%' --计算B中字符在A中存在的数量 select @lenSameB=count(*) from dbo.fn_splitstr(@StrB) where @StrA like '%'+splitValue+'%' set @Result =(@lenSameA+@lenSameB)*100 /(@lenA+@lenB) RETURN @Result END