在 PostgreSQL 中使用不同的过滤器简化列聚合
以下代码聚合来自多个表的数据,应用不同的过滤器对已玩、获胜和失败的游戏进行分类。虽然功能强大,但其复杂性和长度保证了更有效的方法。本文探讨了更简单的方法。
利用 FILTER
子句(PostgreSQL 9.4 及更高版本)
PostgreSQL 9.4 及后续版本提供标准 SQL FILTER
子句,支持聚合内的动态过滤。这显着简化了查询:
<code class="language-sql">SELECT u.name, COUNT(*) FILTER (WHERE g.winner_id > 0) AS played, COUNT(*) FILTER (WHERE g.winner_id = u.id) AS won, COUNT(*) FILTER (WHERE g.winner_id <> u.id) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
旧 PostgreSQL 版本的替代品
对于 PostgreSQL 9.4 之前的版本,可以使用在聚合函数中使用布尔表达式的解决方法:
<code class="language-sql">SELECT u.name, COUNT(g.winner_id > 0 OR NULL) AS played, COUNT(g.winner_id = u.id OR NULL) AS won, COUNT(g.winner_id <> u.id OR NULL) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
此方法虽然效率低于 FILTER
子句,但为较旧的 PostgreSQL 安装提供了实用的解决方案。
总结
使用 FILTER
子句 (PostgreSQL 9.4 ) 或布尔解决方法提供了更简洁且在大多数情况下性能更高的解决方案。 FILTER
子句是新版本的首选方法,因为它提高了可读性和效率。 对于旧版本,布尔解决方法仍然是一个可行的替代方案。
以上是如何在 PostgreSQL 中使用不同的过滤器简化聚合列?的详细内容。更多信息请关注PHP中文网其他相关文章!