У меня есть следующая таблица
Когда я запускаю следующий запрос, он должен был показать все имена инструкторов, содержащие «s», но это не так. Запрос, который я написал:
SQL> SELECT instructor_name
2 FROM instructor
3 WHERE instructor_name LIKE '%s%';
Результат:
В чем проблема? Разве Балбир Силакар и Саурав Пангени тоже не должны появиться в результате?
Похоже, ваша таблица создана с учетом регистра, т.е. 's' <> 'S'
вы ищете "s", а технически "S" это нечто другое
Ваша база данных (я думаю, по умолчанию) чувствительна к регистру, поэтому механизм сопоставления LIKE чувствителен к регистру. Эти имена содержат заглавную букву S.
Вот вопросы и ответы о том, как сделать поиск нечувствительным к регистру. Выполнение запроса Like без учета регистра в базе данных SQL Server с учетом регистра
Вы уверены, что OP использует MS SQL Server? (Я не узнаю изображение на экране.)
'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')
Я не удивлюсь, если регулярное выражение будет самым быстрым вариантом из трех.
Для проверки без учета регистра используйте 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%';
Похоже, что используется сопоставление с учетом регистра. Либо укажите сопоставление без учета регистра, либо используйте LOWER(), например.
WHERE lower(instructor_name) LIKE '%s%'
.