代码之家  ›  专栏  ›  技术社区  ›  mwild

部分/缩写名称匹配

  •  2
  • mwild  · 技术社区  · 6 年前

    我的数据库如下

    FirstName | Middle Name | Surname
    ----------------------------------
    Joe       | James       | Bloggs
    J         | J           | Bloggs
    Joe       |             | Bloggs
    Jane      |             | Bloggs
    

    现在如果用户输入他们的名字

    J Bloggs
    

    我的查询应该返回所有4行,因为它们都是潜在的匹配。

    J J Bloggs
    

    应返回所有行。

    Joe Bloggs
    

    只应返回前三个。

    SELECT * 
    FROM PERSON 
    WHERE CONCAT(' ',FirstName,' ',MiddleName,' ', Surname) LIKE '% Joe%'
        AND CONCAT(' ',FirstName,' ',MiddleName,' ', Surname, ' ') LIKE '% Bloggs%';
    

    但这不返回“J J Bloggs”。

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Tim Biegeleisen    6 年前

    如果我正确地理解了您的逻辑,那么如果三个输入名组件中的任何一个是表中某个值的子字符串,或者相反,那么它们都被认为是匹配的。也就是说, J 比赛 Joe ,但同时 匹配到 J型 . 使用此逻辑,我们可以编写以下查询:

    SELECT *
    FROM yourTable
    WHERE
        (INSTR(FirstName, 'J') > 0 OR INSTR('J', FirstName) > 0) AND
        (INSTR(MiddleName, 'J') > 0 OR INSTR('J', MiddleName) > 0 OR MiddleName IS NULL) AND
        (INSTR(Surname, 'Bloggs') > 0 OR INSTR('Bloggs', Surname) > 0);
    

    Demo

    注意中间名有一些额外的逻辑。如果记录中缺少中间名(即 NULL

        2
  •  0
  •   Barry    6 年前

    我想你可能需要 OR 而不是 AND ...

    SELECT * 
    FROM PERSON 
    WHERE CONCAT(' ',FirstName,' ',MiddleName,' ', Surname) LIKE '% Joe%'
        OR CONCAT(' ',FirstName,' ',MiddleName,' ', Surname, ' ') LIKE '% Bloggs%';