Referencia de funciones

FILTER

Construcción SQL

Deja para una función de agregación solo las filas que cumplen una condición.

PostgreSQL 17.9
aggregate_function(...) FILTER (WHERE condition)
aggregate_function
Función de agregación: COUNT, SUM, AVG, STRING_AGG y otras
Nombre
condition
Condición para elegir las filas de esta función
boolean

Valor devuelto

Resultado de la función de agregación sobre las filas elegidas

Ejemplos

Todos los pagos y los caros

PostgreSQL 17.9
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

Pagos por años

PostgreSQL 17.9
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

Solo los nombres de los hijos

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

Detalles

La condición solo afecta a una función, así que una consulta puede calcular varios indicadores con condiciones distintas. Es más corto que SUM(CASE WHEN ... THEN ... END), la notación de MySQL, donde FILTER no existe.

Si ninguna fila cumple la condición, COUNT devuelve 0, mientras que SUM y las demás funciones devuelven NULL.

Véase también