我正在尝试将这个 Levenshtein Distance 算法 从 MySQL 转换为 SQL Server。
我对
CONCAT(@cv1, UNHEX(HEX(@j)))
和 CONV(HEX(SUBSTRING(@cv1, @j, 1)), 16, 10)
很着迷,因为我不知道 SQL Server 中 HEX()、UNHEX() 和 CONV() 的等效函数。 我认为我可以使用CONVERT()
,但我不完全确定如何使用。
这是我所拥有的:
CREATE FUNCTION fn_FuzzyMatch(
@str1 varchar(max),
@str2 varchar(max) )
RETURNS int
AS
BEGIN
DECLARE
@str1_len int,
@str2_len int,
@i int,
@j int,
@c int,
@c_temp int,
@cost int,
@str1_char char,
@cv0 varbinary(max),
@cv1 varbinary(max);
SELECT
@str1_len = SDU_Tools.StringLength(@str1),
@str2_len = SDU_Tools.StringLength(@str2),
@cv1 = 0x00,
@j = 1,
@i = 1,
@c = 0;
IF @str1 = @str2
RETURN 0;
ELSE IF @str1_len = 0
RETURN @str2_len;
ELSE IF @str2_len = 0
RETURN @str1_len;
ELSE
BEGIN
WHILE @j <= @str2_len
BEGIN
SET @cv1 = CONCAT(@cv1, UNHEX(HEX(@j)));
SET @j = @j + 1;
END;
WHILE @i <= @str1_len
BEGIN
SELECT
@str1_char = SUBSTRING(@str1, @i, 1),
@c = @i,
@cv0 = UNHEX(HEX(@i)),
@j = 1;
WHILE @j <= @str2_len
BEGIN
SET @c = @c + 1;
IF @str1_char = SUBSTRING(@str2, @j, 1)
SET @cost = 0;
ELSE
SET @cost = 1;
SET @c_temp = CONV(HEX(SUBSTRING(@cv1, @j, 1)), 16, 10) + @cost;
IF @c > @c_temp
SET @c = @c_temp;
SET @c_temp = CONV(HEX(SUBSTRING(@cv1, @j+1, 1)), 16, 10) + 1;
IF @c > @c_temp
SET @c = @c_temp;
SET @cv0 = CONCAT(@cv0, UNHEX(HEX(@c)))
SET @j = @j + 1;
END;
SET @cv1 = @cv0
SET @i = @i + 1;
END;
END;
RETURN @c;
END
MySQL 组合
UNHEX(HEX(integer-value))
正在将小整数 ASCII 代码转换为 ASCII 字符。 SQL Server 等效项是 CHAR(integer-value)
。这会将 0 转换为 NUL 控制字符,1 转换为 SOH,55 转换为 ASCII 数字“7”。
MySQL 组合
)
则执行相反的操作,将 ASCII 字符转换为 ASCII 字符代码。 SQL Server 等效项是 ASCII(character-value)
。这会将 NUL 控制字符转换为 0,将 SOH 转换为 1,将 ASCII 数字“7”转换为 55。
我