SQLsever 两个字段相似程度算法 (总结)

 1.两个字段简单相似
 
---两个字段简单相似 CREATE 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' )

两个字段相似
IF object_id('F_strcompare') IS NOT NULL
BEGIN
PRINT 'Dropping function F_strcompare'
DROP FUNCTION F_strcompare
IF @@ERROR = 0 PRINT 'Function F_strcompare dropped '
END
go
CREATE FUNCTION F_strcompare(@str1 VARCHAR(8000),
@str2 VARCHAR(8000))
RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @i INT,
@j INT,
@k INT,
@ret VARCHAR(10)
SELECT @i = MAX(strlen),
@j = MIN(strlen),
@k = 0
FROM (SELECT strlen=Len(@str1)
UNION
SELECT strlen=Len(@str2)) t
IF( @j = 0 )
RETURN '0%'
WHILE @j > 0
BEGIN
IF Substring(@str1, @j, 1) = Substring(@str2, @j, 1)
SET @k=@k + 1
SET @j=@j - 1
END
SET @ret = Rtrim(CAST(@k * 100.0 / @i AS NUMERIC(3, 0))) + '%'
RETURN @ret
END
GO
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值