MySQL Levenshtein [英] MySQL Levenshtein
本文介绍了MySQL Levenshtein的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试创建一个MySQL函数来计算levenshtein距离.我发现了一个看起来很接近我所需功能的函数,但是它到处都会抛出错误-我是MySQL函数的新手,所以我不知道哪里出了问题?
I'm trying to create a MySQL function for calculating the levenshtein distance. I found a function which looked pretty close to what I need, however it keeps throwing errors everywhere - I am new to MySQL functions so I have no idea what is wrong?
这是函数:
DELIMITER $$
CREATE FUNCTION LEVENSHTEIN( s1 CHAR(255), s2 CHAR(255))
RETURNS int(3)
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR(255);
DECLARE cv0, cv1 CHAR(255);
SET s1_len = LENGTH(s1);
SET s2_len = LENGTH(s2);
SET cv1 = 0x00;
SET j = 1;
SET i = 1;
SET c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSE IF s1_len = 0 THEN
RETURN s2_len;
ELSE IF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN
SET cost = 0; ELSE SET cost = 1;
END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN
SET c = c_temp;
END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END$$
DELIMITER ;
这是错误(到目前为止).
And here is the error (so far).
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHILE; END IF; RETURN c; END' at line 36
编辑:可以在此处找到原始代码>
Original code can be found here
推荐答案
在创建函数之前不要忘记更改delimiter
.
don't forget to change the delimiter
before creating the function.
DELIMITER $$
CREATE FUNCTION LEVENSHTEIN( s1 CHAR(255), s2 CHAR(255))
RETURNS int(3)
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR(255);
DECLARE cv0, cv1 CHAR(255);
SET s1_len = LENGTH(s1);
SET s2_len = LENGTH(s2);
SET cv1 = 0x00;
SET j = 1;
SET i = 1;
SET c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSE IF s1_len = 0 THEN
RETURN s2_len;
ELSE IF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN
SET cost = 0; ELSE SET cost = 1;
END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN
SET c = c_temp;
END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END$$
DELIMITER ;
这篇关于MySQL Levenshtein的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文