【发布时间】:2014-09-07 14:54:38
【问题描述】:
我有一个前端搜索框,用户可以在其中按名字、中间名、姓氏或职位搜索某人,并且大部分后端代码如下所示:
SELECT TOP 50 * FROM (SELECT [EmployeeId], SUM(MatchOrder) as MatchOrder
FROM (SELECT
[EmployeeId],
CASE WHEN A.[EmployeeFieldId] = 4 Then 15 --Surname
WHEN A.[EmployeeFieldId] in (1, 2) Then 15 --PreferredName, FirstName
WHEN A.[EmployeeFieldId] = 3 Then 5 --MiddleName
WHEN A.[EmployeeFieldId] = 5 Then 20 --JobTitle
ELSE 3
END as MatchOrder
FROM [latest].[EmployeeAttributes] A
WHERE (' + @search + ')
) internal
GROUP BY EmployeeId) A
join dbo.vwEmployees E on E.EmployeeId = A.EmployeeId -- TEMP
ORDER BY 2 DESC'
每个员工 ID 都有一个分数 (MatchOrder),该分数取决于满足上述条件的多少(例如,名字 + 姓氏匹配 = 30),然后搜索按 MatchOrder 分数排序,然后由前端,但问题是如果某人的名字和姓氏非常相似,例如Patrick Patterson 和我只搜索 Pat Rice,然后 Patrick Patterson(30 分)出现在 Patrick Rice(30 分)上方,因为名字被匹配了两次。
如果匹配是双重的,我希望它降低分数,或者修改我的 switch 语句以某种方式做到这一点(嵌套案例?
你知道我该如何应对吗?任何帮助将不胜感激。
谢谢
【问题讨论】:
标签: sql-server tsql