2014-09-04 27 views
0

我有一个前端的搜索框,用户可以搜索某人的名字,中间名,姓或职称和散装的后端代码是这样的:TSQL搜索框名字姓氏顺序优先级

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' 

每个employeeID都会得到一个分数(MatchOrder),这个分数取决于满足上述多少条件(例如First Name + Surname match = 30),然后根据MatchOrder分数排序以显示在前端,但问题是,如果某人的姓和名是非常相似的,例如帕特里克帕特森和我只搜索帕特赖斯,帕特里克帕特森(30分)出现在帕特里克赖斯(30分)以上,因为名字匹配两次。

我想它要么降低分的成绩如果比赛是双发,或修改我的switch语句以某种方式做到这一点(巢式病例?

你知道我怎么能解决这个问题?任何帮助将不胜感激。

感谢

回答

0

由于[EmployeeFieldId]始终映射到相同的[MatchOrder],你应该能够通过包括[EmployeeFieldId]在“内部”来控制这个结果集,并掌掴一名男生SELECT上的DISTINCT子句:

SELECT DISTINCT 
     [EmployeeId], 
     [EmployeeFieldId], 
     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 + ') 

这样,每个员工将得到最大的一个相同的字段ID应用于他​​们的分数。

+0

嘿@duney - 为你做了这项工作吗?让我知道,如果它没有给你你想要的和关于需求的更多细节,我可以提供帮助。 – 2014-09-11 20:09:47