Справочник по функциям

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;
all_paymentsexpensiveexpensive_total
28687800

Платежи по годам

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;
family_memberin_2005in_2006
162
270
341
420
560

Имена только детей

PostgreSQL 17.5
SELECT STRING_AGG(member_name, ', ') FILTER (
		WHERE status IN ('son', 'daughter')
	) AS children
FROM FamilyMembers;
children
Andie Quincey, Lela Quincey, Annie Quincey, Wednesday Addams

Подробности

Условие действует только на одну функцию, поэтому в одном запросе можно посчитать несколько показателей по разным условиям. Это короче, чем SUM(CASE WHEN ... THEN ... END) — запись, которую используют в MySQL, где FILTER нет.

Если ни одна строка не подошла, COUNT вернёт 0, а SUM и другие функции — NULL.

Смотрите также