Частичное / сокращенное соответствие имен - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь написать запрос, который будет соответствовать частичным совпадениям с сохраненными значениями имени.

Моя база данных выглядит следующим образом

Цитата

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%';

Но это не возвращает 'JJ Bloggs'.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Если я правильно понимаю вашу логику, любой из трех компонентов имени входа считается совпадающим, если он либо является подстрокой значения в таблице, либо наоборот.То есть 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), мы отбрасываем требование соответствия средних имен.

0 голосов
/ 11 октября 2018

Я думаю, вам может понадобиться OR вместо AND ...

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