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

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

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

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

Результат:

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

Похоже, что используется сопоставление с учетом регистра. Либо укажите сопоставление без учета регистра, либо используйте LOWER(), например. WHERE lower(instructor_name) LIKE '%s%'.

jarlh 15.12.2020 15:37

Похоже, ваша таблица создана с учетом регистра, т.е. 's' <> 'S'

Joachim Isaksson 15.12.2020 15:37

вы ищете "s", а технически "S" это нечто другое

DPH 15.12.2020 15:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
3
88
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Вы уверены, что OP использует MS SQL Server? (Я не узнаю изображение на экране.)

jarlh 15.12.2020 15:43
Ответ принят как подходящий

'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%';

Другие вопросы по теме