Почему отсутствуют некоторые результаты для SQL-запроса, содержащего определенные алфавиты?

Dec 15 2020

У меня есть следующая таблица

Когда я запускаю следующий запрос, он должен был показать все имя инструктора, содержащее 's', но это не так. Запрос, который я написал:

SQL> SELECT instructor_name
  2  FROM instructor
  3  WHERE instructor_name LIKE '%s%';

Результат:

В чем проблема? Разве в результате не должны появиться Балбир Силакар и Саурав Пангени?

Ответы

1 GMB Dec 15 2020 at 21:47

's'и 'S'две разные вещи, если ваш столбец имеет сортировку с учетом регистра.

Увы, Oracle не предоставляет версию без учета регистра like(обычно вызываемую ilikeв других базах данных).

Вы могли сделать:

where instructor_name like '%s%' or instructor_name like '%S%' 

Или же:

where lower(instructor_name) like '%s%' 

Или вы можете использовать regexp_like(); он принимает третий аргумент, который можно использовать, чтобы сделать поиск нечувствительным к регистру.

where regexp_like(instructor_name, 's', 'i')

Я не удивлюсь, что регулярное выражение будет самым быстрым вариантом из трех.

catfood Dec 15 2020 at 21:39

Ваша база данных (по умолчанию, я думаю) чувствительна к регистру, поэтому механизм сопоставления LIKE чувствителен к регистру. Эти имена содержат заглавные буквы S.

Вот вопросы и ответы о том, как сделать поиск без учета регистра. Выполнение запроса Like без учета регистра в базе данных SQL Server с учетом регистра

leftjoin Dec 15 2020 at 21:47

Для проверки без учета регистра используйте regexp_like

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

Как отмечали другие, s(chr (115)) и S(chr (83)) - две разные вещи, и их нет sв «Балбир Силакар» или «Саурав Пангени».

Из Oracle 12.2 вы можете использовать

where instructor_name collate binary_ci like '%s%';

Вы можете дополнительно игнорировать акценты с помощью

where instructor_name collate binary_ai like '%s%';