Бран · продюсер «Хроник Пограничья»
К выходу «Огненного Хребта» дарим драконий облик всем, у кого в нике есть «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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.