Levenshtein 距离,但用于字符的 CONV、HEX、UNHEX 的内容

问题描述 投票:0回答:1

我正在尝试将这个 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
sql sql-server levenshtein-distance
1个回答
0
投票

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。

请参阅以下内容:fiddle1fiddle2。 见

© www.soinside.com 2019 - 2024. All rights reserved.