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

Когда я запускаю следующий запрос, он должен был показать все имя инструктора, содержащее 's', но это не так. Запрос, который я написал:
SQL> SELECT instructor_name
2 FROM instructor
3 WHERE instructor_name LIKE '%s%';
Результат:

В чем проблема? Разве в результате не должны появиться Балбир Силакар и Саурав Пангени?
Ответы
'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')
Я не удивлюсь, что регулярное выражение будет самым быстрым вариантом из трех.
Ваша база данных (по умолчанию, я думаю) чувствительна к регистру, поэтому механизм сопоставления LIKE чувствителен к регистру. Эти имена содержат заглавные буквы S.
Вот вопросы и ответы о том, как сделать поиск без учета регистра. Выполнение запроса Like без учета регистра в базе данных SQL Server с учетом регистра
Для проверки без учета регистра используйте regexp_like
where regexp_like(instructor_name , 's', 'i');
Как отмечали другие, 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%';