Блог

Фільтри в 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 ...).

Кожного разу переконуюсь, що навіть у знайомих інструментах залишаються функції, які можуть помітно спростити життя. Головне — не переставати їх шукати 😊.