Рассмотрим некоторые возможные входы:
John
Smith
John Smith
Ваш первоначальный пример запроса является:
SELECT * FROM people
WHERE
firstname LIKE '%user_submitted_data%' OR
lastname LIKE '%user_submitted_data%'
Теперь, когда пользователь входит в первый вход , этот запрос выберет всех людей, чье имя содержит «Джон»; он также отобрат всех людей, чья фамилия содержит «Джон» (например, все Джонсоны в базе данных). Аналогичным образом, второй вход будет выбирать всех людей, чье имя содержит «Смит»; он также отобрат всех людей, чья фамилия содержит «Смит» (например, Смитсоны и Смитерс). Все идет нормально; он не идеален из-за проблем с чувствительностью к регистру (я буду игнорировать чувствительность к регистру отсюда, но вы, вероятно, не должны игнорировать его вообще), но все будет в порядке.
Третий вход будет выбирать только людей, чье имя содержит «Джон Смит»; он также отобрат тех людей, чья фамилия содержит «Джон Смит». Однако весьма вероятно, что очень мало людей, которые отвечают этим критериям - те, кого называют Джоном Смитом, будут иметь только Джона от первого имени и только Смита в фамилии. Это вряд ли будет тем, что вы имели в виду.
Неясно, есть ли в таблице столбец с именем «полное имя». Если вы это сделаете, вы можете просто сопоставить этот столбец, а не сопоставлять его с именем и фамилией отдельно. Если вы этого не сделаете, возможно, вы можете создать такой столбец, а затем запустить запрос.
SELECT *
FROM (SELECT firstname || ' ' || lastname AS fullname, ... FROM people) AS t
WHERE t.fullname LIKE '%user_submitted_data%'
Это работает достаточно хорошо.
Однако, если вас беспокоят такие имена, как «Шарль де Голль» (или «Шарль де Голль») или «Майкл ван ден Берг»), то совпадение потерпит неудачу, если кто-то войдет в «Шарль Голль» или «Шарль де Голль», Майкл Берг, не говоря уже о Майкле Ванденберге. Вам, вероятно, потребуется заменить любые символы пробела в пользовательском вводе символом «%». Даже тогда вы сталкиваетесь с проблемой, что слова должны отображаться точно в последовательности, заданной пользователем - что может быть неважно, но вы должны сознательно решить, что это не имеет значения. Например, если ввод «Адам Джон Смит», тогда запрос не поймает «Джон Адам Смит»; если вход «Смит, Джон», то он никого не поднимет (скорее всего).
Если вы хотите управлять этим, вам, вероятно, нужно будет токенизировать вход пользователя и выполнять поиск по отдельным словам.Остерегайтесь того, что кто-то спрашивает о подстроке слова (например, кто-то спрашивает об «de» в качестве имени) - ни один из запросов на данный момент не гарантирует, что пользовательские слова ввода соответствуют целым словам в значениях (John vs Johnson), и сделать это с помощью стандартного оператора LIKE SQL почти невозможно.
Спасибо, исправляет. – Jimmy