Die Filter
-Klausel kann generell durch einen Case
-Ausdruck in der Aggregatfunktion umgesetzt werden. Dazu wird die Filterbedingung in die When
-Klausel, der zu aggregierende Wert in die Then
-Klausel übernommen. Da Aggregatfunktionen Null
generell nicht berücksichtigen1, genügt die implizite Else Null
-Klausel, um nicht passende Zeilen zu ignorieren. Die folgenden Ausdrücke sind daher gleichwertig.
SUM(<Ausdruck>) FILTER(WHERE <Bedingung>)
SUM(CASE WHEN <Bedingung> THEN <Ausdruck> END)
Lediglich Count(*)
ist noch als Spezialfall zu nennen, da man „*“ nicht direkt in die Then
-Klausel schreiben kann. Es genügt jedoch, den Stern durch einen Nicht-Null
-Konstante zu ersetzen. Damit ist sichergestellt, dass jede passende Zeile gezählt wird. Für die nicht passenden Zeilen liefert der implizite Else Null
-Zweig Null
, was auch von Count
ignoriert wird.
COUNT(*) FILTER (WHERE <Bedingung>)
COUNT(CASE WHEN <Bedingung> THEN 1 END)
Falls ein set quantifier (Distinct
oder All
) verwendet wird, muss dieser in der Aggregatfunktion vor Case
erhalten bleiben.
… meine Newsletter bestellen, gratis Sticker erhalten, mein Buch kaufen oder an einer Schulung teilnehmen.
Die PostgreSQL-Datenbank unterstützt die Verwendung von Unterabfragen in der Filter
-Klausel (z. B. mittels Exists
).
Da die oben beschriebene Standard-Alternative mit einem Case
-Ausdruck weitestgehend unterstützt wird, rate ich von der Verwendung dieser proprietären Alternativen generell ab.
Countif
(Google BigQuery)Google BigQuery bietet die Aggregatfunktion Countif
an, die vor allem aus Microsoft Excel bekannt ist.
COUNTIF(<Bedingung>) [OVER(…)]
Dasselbe Ergebnis kann man mit der Case
-Alternative erreichen, die dann ein allen gängigen Datenbanken funktioniert:
COUNT(CASE WHEN <Bedingung> THEN 1 END) [OVER(…)]
20 Jahre SQL-Evolution kann man nicht an einem Tag nachholen. Abonniere den Newsletter via E-Mail, Bluesky oder RSS, um sukzessive aufzuholen und modern-sql.com am Radar zu behalten.
Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how
ISO/IEC 9075-2:2023 §10.9 SR 8.
Beim der Emulation mit Case
werden lediglich Window-Funktionen ausgeschlossen: ISO/IEC 9075-2:2023 §10.9 SR 7a.
ISO/IEC 9075-2:2023 §10.9 GR 7a, 8a, 10d. Siehe auch ISO/IEC 9075-2:2023 §4.18.4.
Ausnahme: Array_agg
(ISO/IEC 9075-2:2023 §10.9 GR 12gii (NOTE 528)) – Bei dem Array-Konstruktor mittels Abfrage kann man Null
-Werte auch ohne Filter
-Klausel entfernen.