Hallo,
Ik heb de onderstaande stored function, (lichtelijk aangepast van stackoverflow) en zou daar graag een limiet aan toevoegen (vandaar de 'l' parameter).
Ik had verwacht dat ik met een een extra stukje code binnen één van de loops er zou zijn.
Maar helaas pindakaas dat lijkt niet het geval te zijn. Het idee achter de functie is dus het verschil tussen twee strings te berekenen. Hoeveel karakters moeten er veranderd worden om het één in het andere te veranderen. Waarbij het omdraaien van letters minder zwaar telt als de dam parameter TRUE is. Aangezien dit een zware berekening is zou ik graag een limiet toe willen voegen (als er meer dan 'l' veranderingen nodig zijn, return null). Ik gebruik het voor een 'fuzzy' search op een enkel woord.
Ik heb de onderstaande stored function, (lichtelijk aangepast van stackoverflow) en zou daar graag een limiet aan toevoegen (vandaar de 'l' parameter).
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| DELIMITER $$ DROP FUNCTION IF EXISTS LEVENSHTEIN $$ CREATE FUNCTION levenshtein( s1 VARCHAR(255), s2 VARCHAR(255), l TINYINT, dam BOOLEAN) RETURNS TINYINT DETERMINISTIC BEGIN DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; DECLARE s1_char, s2_char CHAR; -- max strlen=255 DECLARE cv0, cv1, cv2 VARBINARY(256); SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; IF s1 = s2 THEN RETURN 0; ELSEIF s1_len = 0 THEN RETURN s2_len; ELSEIF s2_len = 0 THEN RETURN s1_len; ELSE WHILE j <= s2_len DO SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; END WHILE; WHILE i <= s1_len DO SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; WHILE j <= s2_len DO SET c = c + 1; SET s2_char = SUBSTRING(s2, j, 1); IF s1_char = s2_char THEN SET cost = 0; ELSE SET cost = 1; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; IF c > c_temp THEN SET c = c_temp; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; IF c > c_temp THEN SET c = c_temp; END IF; IF dam THEN IF i>1 AND j>1 AND s1_char = SUBSTRING(s2, j-1, 1) AND s2_char = SUBSTRING(s1, i-1, 1) THEN SET c_temp = CONV(HEX(SUBSTRING(cv2, j-1, 1)), 16, 10) + 1; IF c > c_temp THEN SET c = c_temp; END IF; END IF; END IF; SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; END WHILE; IF dam THEN SET CV2 = CV1; END IF; SET cv1 = cv0, i = i + 1; END WHILE; END IF; RETURN c; END |
Ik had verwacht dat ik met een een extra stukje code binnen één van de loops er zou zijn.
MySQL:
1
2
3
4
| -- If the limit is reached, abort and save calculations IF c = l THEN return null; END IF; |
Maar helaas pindakaas dat lijkt niet het geval te zijn. Het idee achter de functie is dus het verschil tussen twee strings te berekenen. Hoeveel karakters moeten er veranderd worden om het één in het andere te veranderen. Waarbij het omdraaien van letters minder zwaar telt als de dam parameter TRUE is. Aangezien dit een zware berekening is zou ik graag een limiet toe willen voegen (als er meer dan 'l' veranderingen nodig zijn, return null). Ik gebruik het voor een 'fuzzy' search op een enkel woord.
MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD