La clause FILTER
étend les fonctions d’agrégation avec la clause optionnelle WHERE
.Si la clause FILTER
est utilisée, le résultat de l’agrégat est construit uniquement à partir des chaînes qui satisfont également la condition dans la clause optionnelle WHERE
.
En général, une clause de filtrage peut être implémentée en utilisant une clause CASE
dans une fonction d’agrégation : la condition de filtrage doit être placée dans la clause WHEN
, la valeur à agréger dans la clause THEN
.Étant donné que les fonctions d’agrégation ignorent généralement les valeurs NULL
, la clause implicite ELSE NULL
est suffisante pour ignorer les chaînes de caractères qui ne correspondent pas aux conditions du filtre.Les deux expressions suivantes sont équivalentes :
SUM(<expression>) FILTER(WHERE <condition>)
SUM(CASE WHEN <condition> THEN <expression> END)
Pour COUNT(*)
, cet exemple est différent car l’expression *
ne peut pas être utilisée dans une clause THEN
. A la place, toute valeur constante non égale à NULL
est normalement utilisée.
COUNT(*) FILTER(WHERE <condition>)
SUM(CASE WHEN <condition> THEN 1 END)
Exemples FILTER
Example 1. Utilisation de la clause FILTER
SELECT
invoice_year,
SUM(revenue) FILTER (WHERE invoice_month = 1) AS jan_revenue,
SUM(revenue) FILTER (WHERE invoice_month= 2) AS feb_revenue,
...
SUM(revenue) FILTER (WHERE invoice_month = 12) AS dec_revenue
FROM (
SELECT
EXTRACT(YEAR FROM invoices.invoice_date) AS invoice_year,
EXTRACT(MONTH FROM invoices.invoice_date) AS invoice_month,
invoices.revenue AS revenue
FROM invoices
)
GROUP BY invoice_year