Comptage de conditions PostgreSQL : comparaison d'efficacité entre l'instruction CASE et FILTER
La fréquence d'apparition des données dans des tableaux statistiques efficaces est cruciale. PostgreSQL utilise généralement l'instruction CASE pour le comptage conditionnel, mais cette méthode devient fastidieuse lorsque le nombre de valeurs possibles augmente.
Utilisez SUM(CASE WHEN) pour compter :
<code class="language-sql">SELECT sum(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) AS ZERO, sum(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) AS ONE, sum(CASE WHEN question1 = 2 THEN 1 ELSE 0 END) AS TWO, category FROM reviews GROUP BY category</code>
Utilisez COUNT(CASE WHEN) pour compter :
<code class="language-sql">SELECT count(CASE WHEN question1 = 0 THEN 1 END) AS ZERO, count(CASE WHEN question1 = 1 THEN 1 END) AS ONE, count(CASE WHEN question1 = 2 THEN 1 END) AS TWO, category FROM reviews GROUP BY category</code>
Limitations de l'instruction CASE :
Bien que ces méthodes puissent implémenter un comptage conditionnel, elles présentent des inconvénients :
Utilisez FILTER pour optimiser le comptage dans la version PostgreSQL 9.4 :
Pour PostgreSQL 9.4 et supérieur, l'option d'agrégation FILTER fournit une solution efficace :
<code class="language-sql">SELECT category , count(*) FILTER (WHERE question1 = 0) AS zero , count(*) FILTER (WHERE question1 = 1) AS one , count(*) FILTER (WHERE question1 = 2) AS two FROM reviews GROUP BY 1;</code>
Cette méthode utilise la clause FILTER pour appliquer différents filtres, évitant ainsi la surcharge des instructions CASE supplémentaires.
Utilisez OR NULL pour simplifier la syntaxe :
Pour plus de concision, vous pouvez utiliser OR NULL :
<code class="language-sql">SELECT category , count(question1 = 0 OR NULL) AS zero , count(question1 = 1 OR NULL) AS one , count(question1 = 2 OR NULL) AS two FROM reviews GROUP BY 1;</code>
Requête croisée pour les décomptes complexes :
La fonction crosstab() offre les meilleures performances et simplicité lorsqu'il s'agit de traiter un grand nombre d'options :
<code class="language-sql">SELECT * FROM crosstab( 'SELECT category, question1, count(*) AS ct FROM reviews GROUP BY 1, 2 ORDER BY 1, 2' , 'VALUES (0), (1), (2)' ) AS ct (category text, zero int, one int, two int);</code>
En bref, l'option FILTER de PostgreSQL et la syntaxe OR NULL fournissent des méthodes efficaces et pratiques pour le comptage conditionnel, et la fonction crosstab() fonctionne bien dans les scénarios de comptage complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!