【问题标题】:SQL Query sort by closest matchSQL查询按最接近的匹配排序
【发布时间】:2013-08-26 21:43:33
【问题描述】:

我们有一个位置搜索页面,这给我们带来了前所未有的挑战。

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

我们在一个名为“威斯康星州黑河瀑布”的城市有两个地点,我们最近在“威斯康星州河瀑布”开设了一个。

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

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

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

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

我知道我可以简单地更改排序顺序,让“River Falls”首先出现,但这是一个草率的解决方案,仅适用于这种情况。

我想知道是否有办法通过 T-SQL (SQL Server 2008r2) 按“最佳匹配”排序,如果我们搜索“River Falls, WI”,“River Falls”将“获胜”如果我们搜索“Black River Falls”WI,“Black River Falls”就可以了。

【问题讨论】:

标签: tsql sql-server-2008-r2


【解决方案1】:

您可以使用“DIFFERENCE”功能使用最接近的SOUNDEX匹配进行搜索。

Select * From Locations WHERE City=@City ORDER BY Difference(City, @City) DESC

来自 MSDN 文档:

返回的整数是 SOUNDEX 值中的字符数 那是一样的。返回值范围从 0 到 4:0 表示弱或无相似性,4 表示强相似性或 相同的值。

DIFFERENCE 和 SOUNDEX 是排序规则敏感的。

【讨论】:

  • 我在发布问题后发现了这一点。测试和工作。我把它留在这里供后代使用。
  • @i-one - 是的......你是对的。我在我的数据库中正确编码,但在这里输入错误。谢谢!我在这里更正了。
【解决方案2】:

像这样:

;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(..) 或任何其他条件组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多