【问题标题】:TSQL Search Box First Name Surname order priorityTSQL 搜索框名字姓氏顺序优先
【发布时间】: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


    【解决方案1】:

    由于 [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。

    【讨论】:

    • 嘿@duney - 这对你有用吗?如果它没有为您提供您想要的内容以及有关要求的更多详细信息,请告诉我,我可以提供帮助。
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-02-22
    相关资源
    最近更新 更多