Фільтри в 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 ...).
Кожного разу переконуюсь, що навіть у знайомих інструментах залишаються функції, які можуть помітно спростити життя. Головне — не переставати їх шукати 😊.