Раздел 42 · Аналитика данных с нуля

LIKE и ILIKE: поиск по тексту

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Бран · продюсер «Хроник Пограничья»

К выходу «Огненного Хребта» дарим драконий облик всем, у кого в нике есть «dragon». Как угодно написанный: Dragon, DRAGON, dragon_что-то. Сколько обликов раздаём?

В прошлом уроке условие сравнивало значение целиком: class = 'mage'. С никами так не выйдет. «dragon» может стоять в начале, в середине, в конце, большими буквами или маленькими. Нужен поиск не по точному значению, а по образцу.

Поиск с пропусками

Помнишь кроссворды и сканворды? «Слово из пяти букв, вторая О, последняя А»: ?О??А. Ты не знаешь слово, но знаешь его форму, и под неё подходят «КОРКА» и «ДОСКА».

В SQL так ищут через LIKE. Ты пишешь шаблон, где часть символов известна, а вместо неизвестных стоят подстановочные знаки. Их всего два:

ЗнакЧто значитПримерПодходит
%сколько угодно любых символов, даже ни одного'Dragon%'DragonFrost, Dragon
_ровно один любой символ'DRAGON__'DRAGON31, но не DRAGON8658

Всё остальное в шаблоне сравнивается как есть, символ в символ.

SELECT name
FROM characters
WHERE name LIKE 'Dragon%';

Этот запрос найдёт ники, которые начинаются с «Dragon». А «где-то внутри» пишется знаком процента с двух сторон: '%Dragon%'.

Регистр: LIKE строгий

Попробуем найти драконов для Брана:

SELECT count(*) FROM characters WHERE name LIKE '%Dragon%';
 count
-------
   250

250 персонажей. Но LIKE различает большие и маленькие буквы. Он не найдёт dragon_velka и DRAGON31: для него это совсем другие символы. Можно перечислить варианты через OR, но всех сочетаний регистра не перечислишь: DrAgOn тоже кто-то придумает.

В PostgreSQL для этого есть ILIKE, буква I от insensitive, «нечувствительный к регистру»:

SELECT count(*) FROM characters WHERE name ILIKE '%dragon%';
 count
-------
   335

На 85 драконов больше. ILIKE есть не во всех базах: в других диалектах пишут lower(name) LIKE '%dragon%', то есть переводят ник в нижний регистр и ищут маленькими буквами. Про диалекты поговорим отдельно в конце курса.

Кириллица тоже работает: ILIKE 'меч%' найдёт и Меч рассвета, и МЕЧ ГРОМА.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.