SQL Server Express: что-то лучше, чем LIKE, для запросов с ПОДОБНЫМИ именами

Мне нужен специальный оператор, который может быть немного лучше, чем LIKE, для запроса «похожих» значений.

СЦЕНАРИЙ:
У меня есть таблица учеников и таблица уроков. Таблица уроков была импортирована из другого программного обеспечения, поэтому столбец StudentID в импортированных строках пуст. Поэтому нам нужно, чтобы пользователь вручную выбирал соответствующую строку ученика для каждого урока, а затем можно было заполнить столбец StudentID, чтобы они правильно синхронизировались. Обе таблицы содержат имя и фамилию, но многие из них, скорее всего, написаны с ошибками.

После импорта строк я хотел бы представить пользователю имена из строк учеников, имена которых являются «пятью наиболее похожими» на значения, хранящиеся в каждой строке урока. Фактически, я хотел бы представить их в порядке убывания от наиболее близких к наименее похожим.

Запрос, содержащий оператор LIKE, не совсем сокращает его, потому что он требует, чтобы в столбце существовал конкретный текст, и он не возвращает «оценку сходства».

Насколько я понимаю (из нетехнических статей), почтовое отделение США очень хорошо решило эту проблему ... Люди все время неправильно пишут имена и названия улиц, но их алгоритм «найти похожие» очень эффективен.

Я знаю, что алгоритм может варьироваться от одного решения к другому. Например, я прочитал из статьи, что одни алгоритмы учитывают фонетику, другие - подсчет гласных и согласных, а другие считают, что «T» звучит как «P» при разговоре по телефону.

Я МОЖЕТ загрузить каждую запись в код своего приложения и написать свой собственный алгоритм на C #, VB.NET или чем-то еще, но с этим есть много проблем, включая производительность. Я бы предпочел выполнить это в рамках запроса, поэтому ищу альтернативы.

Я использую SQL Server Express, но уверен, что решение применимо к другим платформам баз данных.


person PaulOTron2000    schedule 26.01.2012    source источник


Ответы (2)


SQL Server поддерживает функцию SOUNDEX (), но она работает только для похожих имен, и это не очень хорошо, по крайней мере, если вы работаете с неанглийскими текстами. Вы можете написать свою собственную функцию на C # или vb.net, облегчая любой алгоритм, который может применяться к вашим потребностям, и импортировать ее как скалярную функцию на сервер sql.

person Mithrandir    schedule 26.01.2012
comment
Вы можете написать свою собственную функцию на C # или vb.net, облегчая любой алгоритм, который может применяться к вашим потребностям, и импортировать ее как скалярную функцию на сервер sql. Я МОГУ? Потрясающие! Если я правильно понимаю, я мог бы написать функцию MYSOUNDEX () в vb.net, сохранить ее на сервере и использовать как любую другую функцию SQL? Я понятия не имею, как это сделать, относится ли это к SQL Express? Если я правильно вас понимаю, можете ли вы указать мне ссылки с инструкциями по этому поводу? - person PaulOTron2000; 26.01.2012
comment
Похоже, это мой ответ. Большое спасибо! И, кстати, этот небольшой лакомый кусочек может быть полезен ОЧЕНЬ многими способами! Это лучший вариант со времен нарезанных хранимых процедур! - person PaulOTron2000; 27.01.2012

SQL FreeText может сработать для вас:

http://msdn.microsoft.com/en-us/library/ms176078.aspx

Он выполняет поиск по тезаурусу, хотя я не уверен, насколько хорошо он справляется с именами. Однако его очень легко реализовать.

person Mikey G    schedule 26.01.2012