Script Levenshtein

Ce script permet, lors de la création de nouveau dossier étudiant, de mesurer la différence entre deux chaînes de caractères, sur le nom ou prénom par exemple, en comptant le nombre minimal d’opérations nécessaires pour transformer une chaîne en une autre.

Exemple : ‘Jean Pierre’ et ‘Jean-Pierre’ ont une différence de 1, et Calcium peut alors traiter cela comme un doublon.

Voici la requête SQL :

ATTENTION

Remplacer `calcium` par le nom de votre base de donnée

DELIMITER $$
CREATE DEFINER=`calcium`@`` FUNCTION `levenshtein`(s1 varchar(255), s2 varchar(255)) RETURNS int(11)
    DETERMINISTIC
BEGIN
  DECLARE s1_len,
          s2_len,
          i,
          j,
          c,
          c_temp,
          cost int;
  DECLARE s1_char char;
  -- max strlen=255
  DECLARE cv0,
          cv1 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;
        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;
        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;
        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 ;