Dlaczego brakuje niektórych wyników zapytania SQL zawierających określone alfabety?
Mam następującą tabelę

Kiedy uruchamiam następujące zapytanie, powinno pokazać wszystkie nazwiska instruktorów zawierające „s”, ale tak się nie dzieje. Zapytanie, które napisałem:
SQL> SELECT instructor_name
2 FROM instructor
3 WHERE instructor_name LIKE '%s%';
Wynik to:

Jaki jest tutaj problem? Czy Balbir Silakar i Saurav Pangeni też nie powinni pojawić się na wyniku?
Odpowiedzi
's'
i 'S'
są dwiema różnymi rzeczami, jeśli kolumna ma sortowanie z rozróżnianiem wielkości liter.
Niestety, Oracle nie zapewnia wersji programu bez rozróżniania wielkości liter like
(zwykle nazywanej ilike
w innych bazach danych).
Mógłbyś:
where instructor_name like '%s%' or instructor_name like '%S%'
Lub:
where lower(instructor_name) like '%s%'
Lub możesz użyć regexp_like()
; wymaga trzeciego argumentu, który może być użyty do uczynienia wyszukiwania niewrażliwymi na wielkość liter.
where regexp_like(instructor_name, 's', 'i')
Nie zdziwiłbym się, że wyrażenie regularne byłoby najszybszą opcją spośród tych trzech.
W Twojej bazie danych (myślę, że domyślnie) rozróżniana jest wielkość liter, dlatego mechanizm dopasowywania LIKE uwzględnia wielkość liter. Nazwy te zawierają duże litery S.
Oto pytania i odpowiedzi dotyczące tego, jak sprawić, by wyszukiwanie nie uwzględniało wielkości liter. Wykonaj zapytanie Like bez rozróżniania wielkości liter w bazie danych SQL Server z rozróżnianiem wielkości liter
Aby sprawdzić, czy wielkość liter nie jest rozróżniana, użyj regexp_like
where regexp_like(instructor_name , 's', 'i');
Jak wspominali inni, s
(chr (115)) i S
(chr (83)) to dwie różne rzeczy i nie ma ich s
w „Balbir Silakar” czy „Saurav Pangeni”.
Od Oracle 12.2 możesz użyć
where instructor_name collate binary_ci like '%s%';
Możesz dodatkowo zignorować akcenty za pomocą
where instructor_name collate binary_ai like '%s%';