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 otrasNombre
- condition
- Condición para elegir las filas de esta funciónboolean
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;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;Solo los nombres de los hijos
PostgreSQL 17.9
SELECT STRING_AGG(member_name, ', ') FILTER (
WHERE status IN ('son', 'daughter')
) AS children
FROM FamilyMembers;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.