FILTER
SQL-Konstrukt
Lässt für eine Aggregatfunktion nur die Zeilen übrig, die eine Bedingung erfüllen.
PostgreSQL 17.5
aggregate_function(...) FILTER (WHERE condition)Parameter
- aggregate_functionName
- Aggregatfunktion: COUNT, SUM, AVG, STRING_AGG und andere
- conditionboolean
- Bedingung für die Auswahl der Zeilen für diese Funktion
Rückgabewert
Ergebnis der Aggregatfunktion über die ausgewählten Zeilen
Beispiele
Alle und teure Zahlungen
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;Zahlungen nach Jahren
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;Nur die Namen der Kinder
PostgreSQL 17.5
SELECT STRING_AGG(member_name, ', ') FILTER (
WHERE status IN ('son', 'daughter')
) AS children
FROM FamilyMembers;Details
Die Bedingung gilt nur für eine Funktion, deshalb kann eine Abfrage mehrere Kennzahlen mit verschiedenen Bedingungen berechnen. Das ist kürzer als SUM(CASE WHEN ... THEN ... END), die Schreibweise aus MySQL, wo es FILTER nicht gibt.
Passt keine Zeile, gibt COUNT 0 zurück, SUM und andere Funktionen dagegen NULL.