首页 > 解决方案 > 如何避免在 SQL 中多次计算相同的表达式

问题描述

在以下 SQL 中,SUM(i) 和 SUM(y) 的计算不止一次:

SELECT
    IF(SUM(i) > 3000, 3000, SUM(i)) AS total_x,
    CASE 
       WHEN SUM(y) > 3000 THEN 3000
       WHEN SUM(y) < 0 THEN 0
       ELSE SUM(y)
    END AS total_y
FROM t

是否有任何方法可以只计算一次 SUM(i) 和 SUM(y)(以获得更好的性能),或者 SQL 引擎足够聪明,可以在内部优化它而无需人工干预?

我的数据库引擎在 Hive 中,但是这个问题可以应用于任何 SQL 数据库。

标签: sqlhive

解决方案


您可以使用CTE

WITH CTE AS (SELECT SUM(i) AS SUM_I, SUM(y) AS SUM_Y
             FROM t)
SELECT
    IF(SUM_I > 3000, 3000, SUM_I) AS total_x,
    CASE 
       WHEN SUM_Y > 3000 THEN 3000
       WHEN SUM_Y < 0 THEN 0
       ELSE SUM_Y
    END AS total_y
FROM CTE

推荐阅读