Rozważmy kilka możliwych wejść:
John
Smith
John Smith
Początkowej zapytania próbki wynosi:
SELECT * FROM people
WHERE
firstname LIKE '%user_submitted_data%' OR
lastname LIKE '%user_submitted_data%'
Teraz, gdy użytkownik wchodzi do pierwszego wejścia , to zapytanie wybierze wszystkie osoby, których imię zawiera "John"; wybierze także wszystkie osoby, których nazwisko zawiera "John" (na przykład wszystkie Johnsons w bazie danych). Podobnie drugie wejście wybierze wszystkich ludzi, których imię zawiera "Smith"; wybierze także wszystkich ludzi, których nazwisko zawiera "Smith" (na przykład Smithsons and Smithers). Jak na razie dobrze; nie jest idealny ze względu na rozróżnianie wielkości liter (od tego momentu zignoruję wielkość liter, ale prawdopodobnie nie należy tego ignorować), ale wszystko będzie w porządku.
Trzecie wejście wybierze tylko osoby, których imię zawiera "John Smith"; wybierze także tych ludzi, których nazwisko zawiera "John Smith". Jednak jest raczej prawdopodobne, że jest bardzo mało ludzi, którzy spełniają te kryteria - ci ludzie zwani John Smith będą mieli po prostu Johna w imieniu i tylko Smith w imię. To raczej nie jest to, o czym myślałeś.
Nie jest jasne, czy w tabeli znajduje się kolumna o nazwie "fullname". Jeśli to zrobisz, możesz po prostu dopasować do tej kolumny zamiast dopasowywania pojedynczo do imienia i nazwiska. Jeśli tego nie zrobisz, być może uda ci się wytworzyć taką kolumnę, a następnie odpytuj ją.
SELECT *
FROM (SELECT firstname || ' ' || lastname AS fullname, ... FROM people) AS t
WHERE t.fullname LIKE '%user_submitted_data%'
Działa to całkiem dobrze.
Jeśli jednak martwisz się nazwami takimi jak "Charles De Gaulle" (lub "Charles de Gaulle") lub "Michael van den Berg"), dopasowanie nie powiedzie się, jeśli ktoś wejdzie do "Charlesa Gaulle'a" lub "Charlesa Gaulle'a". Michael Berg ", a co dopiero Michael Vandenberg. Prawdopodobnie będziesz musiał zastąpić dowolne spacje w danych wejściowych użytkownika symbolem "%". Nawet wtedy stajesz wobec problemu, że słowa muszą pojawiać się dokładnie w kolejności podanej przez użytkownika - co może nie mieć znaczenia, ale powinieneś świadomie zadecydować, że to nie ma znaczenia. Na przykład, jeśli dane wejściowe to "Adam John Smith", zapytanie nie będzie miało znaczenia "John Adam Smith"; jeśli wprowadzeniem jest "Smith, John", to nie będzie nikogo odbierać (najprawdopodobniej).
Jeśli chcesz sobie z tym poradzić, prawdopodobnie musisz tokenizować dane wprowadzane przez użytkownika i wyszukiwać osobne słowa.Uważaj na kogoś, kto pyta o podciąg łańcucha słowa (na przykład ktoś pyta o "de" jako słowo imienne) - żadne z zapytań w tym momencie nie gwarantuje, że słowa wprowadzone przez użytkownika pasują do całych słów w wartościach (John vs Johnson), a czyniąc to za pomocą standardowego SQL LIKE operator jest prawie niemożliwy.
Dzięki, to naprawia. – Jimmy