SELECT id, email
FROM users
WHERE LOWER(email) = LOWER('Anna@Mail.RU');
Результат:
id | email ---+------------- 7 | anna@mail.ru
SELECT
UPPER(country_code) AS cc
FROM users
LIMIT 2;
Результат:
cc -- RU KZ
SELECT
LOWER(city) AS city,
COUNT(*) AS cnt
FROM users
GROUP BY LOWER(city)
LIMIT 2;
Результат:
city | cnt -------+---- москва | 120 казань | 45Порешать SQL-задачи в тренажёре →
Классический вопрос — как сделать регистронезависимое сравнение и дедуп email/логинов. Идёт в паре с TRIM, LIKE/ILIKE и функциональными индексами по LOWER(col).
Встроенные UPPER/LOWER в SQLite покрывают только латиницу, поэтому русские буквы проходят без изменений. Решения: подключить ICU-расширение, нормализовать регистр на стороне приложения, либо использовать PostgreSQL/MySQL, где Unicode обрабатывается через collation.
Да, функция поверх колонки мешает использовать обычный индекс, и база уходит в полное сканирование. Создайте функциональный (expression) индекс по LOWER(col) или используйте регистронезависимое сравнение: ILIKE или тип CITEXT в PostgreSQL.
В PostgreSQL можно сравнивать через ILIKE — он сам игнорирует регистр. В MySQL сравнения по умолчанию регистронезависимы при ci-коллации. В SQLite оператор LIKE нечувствителен к регистру, но только для ASCII-символов.
STRING_AGG · COUNT · SUM OVER · SUBSTR · ROUND · CONCAT
Открыть SQL-тренажёр (565 задач) →