部分/缩写名称匹配

gijlo24d  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(440)

我试图写一个查询,将匹配部分匹配存储的名称值。
我的数据库如下所示
块引用

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 bloggs'。
有什么想法吗?

xu3bshqb

xu3bshqb1#

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

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

7cjasjjr2#

如果我正确理解了您的逻辑,那么三个输入名称组件中的任何一个都被认为是匹配的,如果它是表中某个值的子字符串,反之亦然。也就是说, J 比赛 Joe ,但也 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);

演示

请注意,中间名有一些附加逻辑。如果记录中缺少中间名(即 NULL ),然后我们将要求中间名匹配。

相关问题