Блог

Фильтры в SQL-запросах

Юрий Мельников

Короткая заметка о том, как фильтры сокращают количество запросов в БД.

Как говорится, век живи — век учись. Вот и я открыл для себя новую функцию SQL, о которой ранее не знал: фильтры в запросах COUNT. Но обо всём по порядку.

В большинстве моих проектов я редко делал запросы COUNT. А если и делал, то только по одному значению. Почему-то так совпадало.

Сегодня же мне нужно было из одной таблицы с запросами посчитать сразу несколько значений: всего запросов, успешных запросов и запросов с ошибкой.

Делать три запроса с условием  WHERE — не лучшая идея, так как их количество умножалось ещё на количество ендпоинтов, то для загрузки одной страницы могло получаться больше десятка COUNT, а это не круто.

Решение я нашёл очень быстро: использование ключевого слова FILTER:

SELECT COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'done') AS done,
COUNT(*) FILTER (WHERE status = 'failed') AS failed
FROM requests

В результате — один запрос, один проход по данным и аккуратный, читаемый SQL без SUM(CASE WHEN ...).

Каждый раз убеждаюсь, что даже в знакомых инструментах остаются функции, которые могут заметно упростить жизнь. Главное — не переставать их искать 😊