ado*_*lot 8 sql-server order-by pattern-matching
我想知道如何实现 SQL 以获得按类似谓词的最佳匹配排序的结果。我在数据库中有 10 万篇文章,当用户按名称的一部分调用某些项目时。我想显示按查询的最佳匹配排序的结果。
我会试着用伪代码来描述
select
*
from
articles
where item_nale like '%'+@user_input +'%'
order by "BEST MATCH"
Run Code Online (Sandbox Code Playgroud)
db2*_*db2 22
由于您的所有匹配项都必须匹配 LIKE 模式才能被包含在内,因此要做的简单事情是假设您匹配的列的较短值是“更好”的匹配项,因为它们更接近于图案。
ORDER BY LEN(item_nale) ASC
Run Code Online (Sandbox Code Playgroud)
或者,您可以假设匹配模式较早出现的值是“更好的”匹配。
ORDER BY PATINDEX('%' + @user_input + '%', item_nale) ASC
Run Code Online (Sandbox Code Playgroud)
或者你可以将两者结合起来;首先寻找最早的匹配项,在这些匹配项中,更喜欢较短的值。
ORDER BY PATINDEX('%' + @user_input + '%', item_nale) ASC, LEN(item_nale) ASC
Run Code Online (Sandbox Code Playgroud)
它不像全文索引那样复杂,它只考虑单个列的匹配,但它提供了足够好的结果。