不知道你的相似度判断的规则是什么,通过数据库实现的话,可以考虑定义一个相似度比较函数,然后在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
本文介绍了一种使用SQL函数实现字符相似度判断,并应用于数据库更新的方法。通过定义相似度比较函数,实现对数据库中不规则名称与标准名称进行匹配与更新的过程。
函数写完整。
其他数据库应该也可以用相同思路来做吧。
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)>相似度的值
462

被折叠的 条评论
为什么被折叠?



