Accéder au contenu principal
Documents
Gestion des tableaux et des schémasSyntaxe de baseDéclencheursBases de donnéesFonctions de la dateFonctions des chaînes de caractèresFonctions mathématiquesFonctions JSONIndexes

FILTRE PostgreSQL

La clause `FILTER` de PostgreSQL est utilisée pour appliquer des conditions aux fonctions d'agrégation, permettant un contrôle plus granulaire sur les lignes incluses dans l'agrégation. Elle est particulièrement utile pour effectuer une agrégation conditionnelle directement dans l'appel de la fonction d'agrégation.

Utilisation

La clause `FILTER` est utilisée avec les fonctions d'agrégation pour spécifier une condition qui détermine quelles lignes sont incluses dans le calcul. Il est écrit immédiatement après la fonction agrégée, entre parenthèses.

sql
SELECT aggregate_function(column) FILTER (WHERE condition)
FROM table_name;

Dans cette syntaxe, `FILTER (WHERE condition)` garantit que seules les lignes répondant à la condition spécifiée sont prises en compte par la fonction d'agrégation. Les fonctions d'agrégation courantes utilisées avec `FILTER` sont `SUM`, `COUNT`, `AVG`, `MIN` et `MAX`. En outre, la clause `FILTER` peut être combinée avec des fonctions de fenêtre pour les requêtes analytiques.

Exemples

1. Utilisation de base avec COUNT

sql
SELECT COUNT(*) FILTER (WHERE status = 'active') AS active_count
FROM users;

Cet exemple ne compte que les tableaux du tableau `users` dont le `status` est 'active'.

2. Utilisation de FILTER avec SUM

sql
SELECT SUM(salary) FILTER (WHERE department = 'IT') AS total_it_salary
FROM employees;

Ici, la fonction `SUM` calcule le total des salaires uniquement pour les employés du département 'IT'.

3. Combinaison de plusieurs agrégats

sql
SELECT 
    COUNT(*) AS total_orders,
    COUNT(order_id) FILTER (WHERE status = 'completed') AS completed_orders,
    AVG(amount) FILTER (WHERE status = 'completed') AS average_completed_amount
FROM orders;

Cet exemple calcule le nombre total de commandes, le nombre de commandes terminées et le montant moyen des commandes terminées, le tout en une seule requête.

Conseils et bonnes pratiques

  • A utiliser pour la logique conditionnelle. Utilisez `FILTER` pour appliquer des conditions directement aux fonctions agrégées, ce qui simplifie les requêtes complexes.
  • Améliorer la lisibilité. En utilisant `FILTER`, vous pouvez éviter les sous-requêtes imbriquées et maintenir une structure de requête plus propre.
  • Combiner avec GROUP BY. `FILTER` peut être efficacement combiné avec `GROUP BY` pour des agrégations conditionnelles groupées. Par exemple :
sql
SELECT department, COUNT(employee_id) FILTER (WHERE status = 'active') AS active_employees
FROM employees
GROUP BY department;
  • Testez les conditions séparément. Assurez-vous que la logique de votre clause `FILTER` est correcte en testant les conditions indépendamment lorsque cela est possible.
  • Observez les performances sur les grands ensembles de données. Bien que `FILTER` puisse simplifier les requêtes, il faut s'assurer que les performances sont optimales, en particulier avec les grands ensembles de données et les conditions complexes.
  • Conformité aux normes SQL. La clause `FILTER` fait partie du standard SQL et offre des avantages de compatibilité pour les requêtes entre bases de données.

Erreurs et pièges courants

  • Malentendu sur la logique des conditions : Assurez-vous que la condition dans la clause `FILTER` est correctement spécifiée pour éviter des résultats inattendus.
  • Considérations sur les performances : Soyez attentif à l'impact potentiel sur les performances des grands ensembles de données et optimisez si nécessaire.

Comparaison entre FILTER et CASE

La clause `FILTER` diffère de l'utilisation des instructions `CASE` dans les fonctions agrégées. Alors que `FILTER` fournit une syntaxe plus concise et plus lisible pour l'agrégation conditionnelle, `CASE` offre une flexibilité pour une logique plus complexe. Choisissez `FILTER` pour des conditions plus simples et `CASE` pour une logique plus détaillée.