FirebirdSQL logo

Fonction FILTER

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>)

et

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>)

et

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

Principales fonctions de l’agrégat