Dlaczego brakuje niektórych wyników zapytania SQL zawierających określone alfabety?

Dec 15 2020

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

1 GMB Dec 15 2020 at 21:47

'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 ilikew 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.

catfood Dec 15 2020 at 21:39

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

leftjoin Dec 15 2020 at 21:47

Aby sprawdzić, czy wielkość liter nie jest rozróżniana, użyj regexp_like

where regexp_like(instructor_name , 's', 'i');
WilliamRobertson Dec 16 2020 at 05:16

Jak wspominali inni, s(chr (115)) i S(chr (83)) to dwie różne rzeczy i nie ma ich sw „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%';