2013-08-26 3 views
3

У нас есть страница поиска местоположений, которая дает нам вызов, с которым я никогда не сталкивался.SQL Query сортировать по ближайшему совпадению

В нашей базе данных есть список городов, состояний и т. Д. С соответствующими геокодами. Все было забавно до сих пор ...

У нас есть два местоположения в городе под названием «Водопад Черной реки, WI», и мы недавно открыли его в «River Falls, WI».

Таким образом, наша таблица содержит записи следующим образом:

Location City    State 
------------------------------------- 
1   Black River Falls WI 
2   Black River Falls WI 
3   River Falls   WI 

Очевидно наш запрос использует «LIKE» положение, чтобы соответствовать город, но когда клиент ищет текст «River Falls», в результатах поиска, Первые показанные результаты всегда «Черные реки».

В нашем приложении мы всегда используем первое совпадение и используем его по умолчанию. (Мы могли бы его изменить, но было бы много не предусмотренных в бюджете)

Я знаю, что я мог бы просто изменить порядок сортировки, чтобы сначала появился «Речной водопад», но это небрежное решение, которое работает только в этот один случай.

Что мне интересно, если есть способ, через T-SQL (SQL Server 2008r2) сортировать по «наилучшему совпадению», где «River Falls» «победит», если мы ищем «River Falls, WI »и« Black River Falls »будут работать, если мы будем искать WI Black River Falls.

+0

У SSIS есть [Нечеткий поиск] (http://technet.microsoft.com/en-us/library/ms137786 (v = sql.105) .aspx) преобразование, которое придаст сходство и уверенность. Также MDS имеет функцию сходства [подробнее] (http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into-mds/) –

ответ

8

Вы можете использовать функцию «DIFFERENCE», чтобы выполнить поиск по ближайшему совпадению SOUNDEX.

Select * From Locations WHERE [email protected] ORDER BY Difference(City, @City) DESC 

Из документации MSDN:

Целое число Возвращается число символов в SOUNDEX значений , которые являются одинаковыми. Возвращаемое значение находится в диапазоне от 0 до 4: 0 указывает на слабое или отсутствие подобия, а 4 указывает на сильное сходство или те же значения.

DIFFERENCE и SOUNDEX чувствительны к сортировке.

+0

I нашел это право после публикации вопроса. Протестировано и работает. Я держу его здесь для будущих поколений. – David

+0

@ i-one - да ... Вы правы. Я закодировал это прямо в моей БД, но набрал его неправильно. Спасибо! Я исправил его здесь. – David

4

Как это:

;WITH cte As 
(
    SELECT * 
     , ROW_NUMBER() OVER(ORDER BY LEN(City)-LEN(@UserText)) As MatchPrio 
    FROM Cities 
    WHERE City LIKE '%'[email protected]+'%' 
) 
SELECT * 
FROM cte 
WHERE MatchPrio = 1 

Обновление:

Вы можете изменить ORDER BY выражения выше также использовать DIFFERENCE(..) или любую другую комбинацию критериев.

Смежные вопросы