SQL的两个字符串的相似度的计算函数

不知道你的相似度判断的规则是什么,通过数据库实现的话,可以考虑定义一个相似度比较函数,然后在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值