在 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中文網其他相關文章!