FILTER
Конструкция SQL
Оставляет для агрегатной функции только строки, которые подходят под условие.
PostgreSQL 17.5
aggregate_function(...) FILTER (WHERE condition)Параметры
- aggregate_functionимя
- Агрегатная функция: COUNT, SUM, AVG, STRING_AGG и другие
- conditionboolean
- Условие отбора строк для этой функции
Возвращаемое значение
Результат агрегатной функции по отобранным строкам
Примеры
Все и дорогие платежи
PostgreSQL 17.5
SELECT COUNT(*) AS all_payments,
COUNT(*) FILTER (
WHERE unit_price >= 1000
) AS expensive,
SUM(amount * unit_price) FILTER (
WHERE unit_price >= 1000
) AS expensive_total
FROM Payments;Платежи по годам
PostgreSQL 17.5
SELECT family_member,
COUNT(*) FILTER (
WHERE date < '2006-01-01'
) AS in_2005,
COUNT(*) FILTER (
WHERE date >= '2006-01-01'
) AS in_2006
FROM Payments
GROUP BY family_member
ORDER BY family_member;Имена только детей
PostgreSQL 17.5
SELECT STRING_AGG(member_name, ', ') FILTER (
WHERE status IN ('son', 'daughter')
) AS children
FROM FamilyMembers;Подробности
Условие действует только на одну функцию, поэтому в одном запросе можно посчитать несколько показателей по разным условиям. Это короче, чем SUM(CASE WHEN ... THEN ... END) — запись, которую используют в MySQL, где FILTER нет.
Если ни одна строка не подошла, COUNT вернёт 0, а SUM и другие функции — NULL.