SQL Academy
Premium
Funktionsreferenz

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

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

Nur die Namen der Kinder

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

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.

Siehe auch