Игнорирование регистра при поиске строки в SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для обеспечения поиска в SQL без учёта регистра в строках используются функции LOWER() и UPPER(). Они приводят как значения столбца, по которому идёт поиск, так и самого поискового выражения к единому регистру:

SQL
Скопировать код
SELECT * FROM table WHERE LOWER(column) = LOWER('searchTerm');
Кинга Идем в IT: пошаговый план для смены профессии

Использование шаблонов с символами подстановки

Если надо выполнить сопоставление шаблонов, игнорируя регистр, можно воспользоваться символами подстановки. Они особенно полезны при поиске фрагмента текста внутри значения поля:

SQL
Скопировать код
SELECT * FROM table WHERE LOWER(column) LIKE LOWER('%partialTerm%');

Установка COLLATE для нечувствительности к регистру

В SQL Server можно установить нечувствительность к регистру с помощью ключевого слова COLLATE и соответствующей последовательности сортировки:

SQL
Скопировать код
SELECT * FROM table WHERE column COLLATE SQL_Latin1_General_Cp1_CI_AS = 'searchTerm';

Визуализация

Приведём аналогию. Представьте, что вы сортируете одежду не по цвету, а по типу. Аналогично, в SQL мы можем настроить условия поиска, игнорируя регистр букв:

Markdown
Скопировать код
Несортированная куча: [👕, 👚, 🧦, 👔, 👕, 🧢]
| Критерий поиска                              | SQL-запрос с игнорированием регистра  | Результат |
|--------------------------------------------|----------------------------------|-----------|
| "найти все футболки, не обращая внимания на цвет" | `WHERE LOWER(clothing) = 'shirt'`  | [👕, 👕]   |

Так, SQL позволяет найти все футболки, независимо от цвета, поскольку различия в регистре не учитываются.

Особенности баз данных для удобства поиска

PostgreSQL и его "козырь": оператор ILIKE

В PostgreSQL поиск без учёта регистра упрощается благодаря оператору ILIKE, который позволяет формулировать запросы наиболее удобно:

SQL
Скопировать код
SELECT * FROM table WHERE column ILIKE '%searchTerm%';

Тонкости SQL Server: настройки сравнения

SQL Server предлагает использовать разные настройки сравнения в сочетании со COLLATE для поиска с игнорированием регистра:

SQL
Скопировать код
SELECT * FROM table WHERE column COLLATE SQL_Latin1_General_Cp1_CI_AS = 'searchTerm';

Важно выбрать подходящую настройку сравнения для получения корректных результатов.

Делаем запрос уникальным с помощью DISTINCT и COLLATE

Используя DISTINCT в сочетании с COLLATE, можно получать уникальные результаты, не учитывая в запросе регистр:

SQL
Скопировать код
SELECT DISTINCT column FROM table WHERE column COLLATE SQL_Latin1_General_Cp1_CI_AS LIKE '%searchTerm%';

Потенциальные "подводные камни" при поиске без учёта регистра

С поиском без учёта регистра могут встретиться некоторые проблемы:

  • Производительность: функции LOWER() и UPPER() могут замедлить выполнение запроса.
  • Совместимость: не все DBMS поддерживают ILIKE или настройки сравнения для игнорирования регистра.
  • Корректность сопоставления: необходимо убедиться, что выбранная настройка сравнения подходит для корректного сравнения столбцов.

Полезные материалы

  1. Stack Overflow: SQL server ignore case in a where expression — обсуждение игнорирования регистра в поиске для SQL Server.
  2. MySQL :: Руководство по MySQL 8.0 :: Примеры влияния сравнения — разъяснение влияния настройки сравнения на выполнение операций сравнения строк в MySQL.
  3. PostgreSQL: Документация: Сопоставление с шаблоном — документация по использованию ILIKE в PostgreSQL.
  4. Условия сопоставления с образцом — руководство Oracle по использованию оператора LIKE для поиска без учёта регистра.
  5. COLLATE (Transact-SQL) – SQL Server | Microsoft Learn — ресурс о COLLATE и особенностях сравнений в SQL Server.
  6. SQL Server: Условие LIKE — инструкция по использованию оператора LIKE в SQL Server для запросов без учёта регистра.