LIKE против ILIKE — чувствительность к регистру
Зачем это нужно
LIKE в PostgreSQL чувствителен к регистру: 'air' и 'Air' и 'AIR' —
разные шаблоны. Это частая причина «пустого» результата. ILIKE решает проблему.
Аналогия с жизнью
Поиск в Google нечувствителен к регистру: «iPhone» и «iphone» дают одинаковый результат.
Поиск в Excel по умолчанию тоже. ILIKE делает поиск таким же — без учёта регистра.
Сравнение LIKE и ILIKE
-- LIKE — чувствителен к регистру
SELECT name FROM products WHERE name LIKE '%air%';
-- Найдёт: ничего! В датасете «Air» с заглавной буквы.
-- ILIKE — нечувствителен к регистру (только PostgreSQL)
SELECT name FROM products WHERE name ILIKE '%air%';
-- Найдёт: AirPods Pro, Кроссовки Nike Air Max
Когда использовать что
| Ситуация | Оператор |
|---|---|
| Данные хранятся с известным регистром | LIKE |
| Пользователь вводит поисковый запрос | ILIKE |
| Поиск по категориям (всегда с заглавной) | LIKE |
| Поиск по названиям товаров (разный регистр) | ILIKE |
Практический пример
-- Поиск по части названия без учёта регистра
SELECT name, price
FROM products
WHERE name ILIKE '%pro%'
ORDER BY price DESC;
-- Найдёт: iPhone 15 Pro, AirPods Pro
NOT LIKE и NOT ILIKE
-- Всё кроме товаров с «Air» в названии
SELECT name FROM products
WHERE name NOT LIKE '%Air%'
ORDER BY name;
Частые ошибки
ILIKE не стандартный SQL — это расширение PostgreSQL. В MySQL используют
LIKE (нечувствителен к регистру по умолчанию), в SQLite — LIKE LOWER().
В нашем курсе работаем с PostgreSQL, поэтому ILIKE доступен всегда.
Шаблон в двойных кавычках — WHERE name ILIKE "%air%" — ошибка.
Шаблон — это строковое значение, нужны одинарные кавычки: ILIKE '%air%'.
Запомни
LIKE — чувствителен к регистру. ILIKE — нечувствителен (PostgreSQL).
Для поискового ввода от пользователя используй ILIKE.
Мини-практика
Какой оператор нужен в каждом случае?
- Найти товары с «AirPods» в названии — точно знаем регистр
- Искать товары по слову, которое вводит пользователь
- Исключить из результатов товары, у которых в названии есть «Pro»
Ответы
LIKE '%AirPods%'— регистр известенILIKE '%слово%'— пользовательский ввод, регистр неизвестенNOT LIKE '%Pro%'илиNOT ILIKE '%pro%'в зависимости от того, известен ли регистр
Прочитайте урок до конца — прогресс засчитается автоматически