Игнорирование регистра при поиске строки в SQL
Быстрый ответ
Для обеспечения поиска в SQL без учёта регистра в строках используются функции LOWER()
и UPPER()
. Они приводят как значения столбца, по которому идёт поиск, так и самого поискового выражения к единому регистру:
SELECT * FROM table WHERE LOWER(column) = LOWER('searchTerm');
Использование шаблонов с символами подстановки
Если надо выполнить сопоставление шаблонов, игнорируя регистр, можно воспользоваться символами подстановки. Они особенно полезны при поиске фрагмента текста внутри значения поля:
SELECT * FROM table WHERE LOWER(column) LIKE LOWER('%partialTerm%');
Установка COLLATE для нечувствительности к регистру
В SQL Server можно установить нечувствительность к регистру с помощью ключевого слова COLLATE
и соответствующей последовательности сортировки:
SELECT * FROM table WHERE column COLLATE SQL_Latin1_General_Cp1_CI_AS = 'searchTerm';
Визуализация
Приведём аналогию. Представьте, что вы сортируете одежду не по цвету, а по типу. Аналогично, в SQL мы можем настроить условия поиска, игнорируя регистр букв:
Несортированная куча: [👕, 👚, 🧦, 👔, 👕, 🧢]
| Критерий поиска | SQL-запрос с игнорированием регистра | Результат |
|--------------------------------------------|----------------------------------|-----------|
| "найти все футболки, не обращая внимания на цвет" | `WHERE LOWER(clothing) = 'shirt'` | [👕, 👕] |
Так, SQL позволяет найти все футболки, независимо от цвета, поскольку различия в регистре не учитываются.
Особенности баз данных для удобства поиска
PostgreSQL и его "козырь": оператор ILIKE
В PostgreSQL поиск без учёта регистра упрощается благодаря оператору ILIKE
, который позволяет формулировать запросы наиболее удобно:
SELECT * FROM table WHERE column ILIKE '%searchTerm%';
Тонкости SQL Server: настройки сравнения
SQL Server предлагает использовать разные настройки сравнения в сочетании со COLLATE
для поиска с игнорированием регистра:
SELECT * FROM table WHERE column COLLATE SQL_Latin1_General_Cp1_CI_AS = 'searchTerm';
Важно выбрать подходящую настройку сравнения для получения корректных результатов.
Делаем запрос уникальным с помощью DISTINCT и COLLATE
Используя DISTINCT
в сочетании с COLLATE
, можно получать уникальные результаты, не учитывая в запросе регистр:
SELECT DISTINCT column FROM table WHERE column COLLATE SQL_Latin1_General_Cp1_CI_AS LIKE '%searchTerm%';
Потенциальные "подводные камни" при поиске без учёта регистра
С поиском без учёта регистра могут встретиться некоторые проблемы:
- Производительность: функции
LOWER()
иUPPER()
могут замедлить выполнение запроса. - Совместимость: не все DBMS поддерживают
ILIKE
или настройки сравнения для игнорирования регистра. - Корректность сопоставления: необходимо убедиться, что выбранная настройка сравнения подходит для корректного сравнения столбцов.
Полезные материалы
- Stack Overflow: SQL server ignore case in a where expression — обсуждение игнорирования регистра в поиске для SQL Server.
- MySQL :: Руководство по MySQL 8.0 :: Примеры влияния сравнения — разъяснение влияния настройки сравнения на выполнение операций сравнения строк в MySQL.
- PostgreSQL: Документация: Сопоставление с шаблоном — документация по использованию ILIKE в PostgreSQL.
- Условия сопоставления с образцом — руководство Oracle по использованию оператора LIKE для поиска без учёта регистра.
- COLLATE (Transact-SQL) – SQL Server | Microsoft Learn — ресурс о COLLATE и особенностях сравнений в SQL Server.
- SQL Server: Условие LIKE — инструкция по использованию оператора LIKE в SQL Server для запросов без учёта регистра.