SQL查询按最接近的匹配排序

Dav*_*vid 3 t-sql sql-server-2008-r2

我们有一个地点搜索页面,它给了我一个前所未有的挑战.

在我们的数据库中,我们有一个城市,州等的列表以及相应的地理编码.到目前为止一切都很有趣......

我们在一个名为"Black River Falls,WI"的城市有两个地点,我们最近在"River Falls,WI"开了一个.

所以我们的表有如下记录:

Location    City                State
-------------------------------------
1           Black River Falls   WI
2           Black River Falls   WI
3           River Falls         WI
Run Code Online (Sandbox Code Playgroud)

显然我们的查询使用"LIKE"子句来匹配城市,但是当客户搜索文本"River Falls"时,在搜索结果中,显示的第一个结果总是"Black River Falls".

在我们的应用程序中,我们始终使用第一个匹配项,并将其用作默认值.(我们可以改变它,但这将是很多未预算的工作)

我知道我可以简单地改变排序顺序,让"河瀑布"首先出现,但这是一个草率的解决方案,只适用于这种情况.

我想知道的是,如果有一种方法,通过T-SQL(SQL Server 2008r2)排序"最佳匹配",如果我们搜索"River Falls,WI"和"Black","River Falls"会"赢"如果我们寻找"黑河瀑布"WI,河瀑布"会工作.

Dav*_*vid 10

您可以使用" DIFFERENCE "功能搜索最近的SOUNDEX匹配.

Select * From Locations WHERE City=@City ORDER BY Difference(City, @City) DESC
Run Code Online (Sandbox Code Playgroud)

从MSDN文档:

返回的整数是SOUNDEX值中相同的字符数.返回值的范围为0到4:0表示弱相似或无相似,4表示强相似或相同值.

DIFFERENCE和SOUNDEX是整理敏感的.


RBa*_*ung 5

像这样:

;WITH cte As
(
    SELECT  *
        ,   ROW_NUMBER() OVER(ORDER BY LEN(City)-LEN(@UserText)) As MatchPrio
    FROM    Cities
    WHERE   City LIKE '%'+@UserText+'%'
)
SELECT *
FROM    cte
WHERE   MatchPrio = 1
Run Code Online (Sandbox Code Playgroud)

更新:

您可以将上面的ORDER BY表达式更改为也可以使用DIFFERENCE(..)或任何其他条件组合.