2014-09-04 28 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