我们有一个地点搜索页面,它为我们提供了一个前所未有的挑战。
在我们的数据库中,我们列出了具有相应地理编码的城市,州等。到目前为止,一切都很有趣......
我们在一个名为“Black River Falls,WI”的城市有两个地点,我们最近在“River Falls,WI”开了一个。
所以我们的表格记录如下:
Location City State
-------------------------------------
1 Black River Falls WI
2 Black River Falls WI
3 River Falls WI
显然我们的查询使用“LIKE”子句来匹配城市,但是当客户搜索文本“River Falls”时,在搜索结果中,显示的第一个结果始终是“Black River Falls”。
在我们的应用程序中,我们始终使用第一个匹配项,并将其用作默认值。 (我们可以改变它,但这将是许多未预算的工作)
我知道我可以简单地改变排序顺序,让“河瀑布”首先出现,但这是一个草率的解决方案,仅适用于这种情况。
我想知道的是,如果有办法,通过T-SQL(SQL Server 2008r2)排序“最佳匹配”,如果我们搜索“River Falls,WI”,“River Falls”会“赢”如果我们寻找“黑河瀑布”WI,“黑河瀑布”将起作用。
答案 0 :(得分:10)
您可以使用“DIFFERENCE”功能搜索最近的SOUNDEX匹配。
Select * From Locations WHERE City=@City ORDER BY Difference(City, @City) DESC
来自MSDN文档:
返回的整数是SOUNDEX值中的字符数 这是一样的。返回值的范围是0到4:0 表示弱相似或不相似,4表示强相似或 相同的价值观。
DIFFERENCE和SOUNDEX是整理敏感的。
答案 1 :(得分: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
更新
您可以将上面的ORDER BY表达式更改为使用DIFFERENCE(..)
或任何其他条件组合。