В конечном счете, вы, похоже, ищете решение для вероятности того, что две строки "нечеткие" соответствуют друг другу.
SQL предоставляет эффективные, оптимизированные встроенные функции, которые сделают это для вас и, вероятно, с лучшей производительностью, чем написанное вами.Две функции, которые вы ищете: SOUNDEX и DIFFERENCE .
Хотя ни одна из них не решает точно то, что вы просили - т.е. они делаютне возвращать процентное совпадение - я считаю, что они решают, чего вы в конечном итоге пытаетесь достичь.
SOUNDEX
возвращает 4-значный код, который является первой буквой слова, плюс 3-значный код, который представляетзвуковая схема слова.Подумайте о следующем:
SELECT SOUNDEX('Alexander')
SELECT SOUNDEX('Alegzander')
SELECT SOUNDEX('Owleksanndurr')
SELECT SOUNDEX('Ulikkksonnnderrr')
SELECT SOUNDEX('Jones')
/* Results:
A425
A425
O425
U425
J520
*/
Что вы заметите, так это то, что трехзначное число 425 одинаково для всех, которые примерно одинаково звучат.Таким образом, вы можете легко сопоставить их и сказать: «Вы напечатали« Owleksanndurr », возможно, вы имели в виду« Александр »?»
Кроме того, есть функция DIFFERENCE
, которая сравнивает расхождение SOUNDEX
между двумястрок и дает ему оценку.
SELECT DIFFERENCE( 'Alexander','Alexsander')
SELECT DIFFERENCE( 'Alexander','Owleksanndurr')
SELECT DIFFERENCE( 'Alexander', 'Jones')
SELECT DIFFERENCE( 'Alexander','ekdfgaskfalsdfkljasdfl;jl;asdj;a')
/* Results:
4
3
1
1
*/
Как видите, чем ниже оценка (между 0 и 4), тем больше вероятность совпадения строк.
ПреимуществоSOUNDEX
сверх DIFFERENCE
в том, что если вам действительно нужно часто выполнять нечеткое сопоставление, вы можете хранить и индексировать данные SOUNDEX
в отдельном (индексируемом) столбце, тогда как DIFFERENCE
может вычислять SOUNDEX
только ввремя сравнения.