PostgreSQL-别名列和

PostgreSQL-别名列和,postgresql,having,column-alias,Postgresql,Having,Column Alias,获取:错误:列»pjz«不存在 我该怎么做呢?不能在having中使用别名,而必须在having clause中复制该语句。由于您只想检查null,因此可以执行以下操作: SELECT CASE WHEN SUM(X.Count)*3600 is null THEN '0' ELSE SUM(X.Count)*3600 END AS PJZ, X.Mass FROM X WHERE X.Ma

获取:错误:列»pjz«不存在


我该怎么做呢?

不能在having中使用别名,而必须在having clause中复制该语句。由于您只想检查null,因此可以执行以下操作:

SELECT  
CASE WHEN SUM(X.Count)*3600 is null THEN  '0'  
            ELSE  
            SUM(X.Count)*3600  
       END AS PJZ,  
       X.Mass  
FROM X  
WHERE X.Mass > 2000  
HAVING ((X.Mass / PJZ * 100) - 100) >= 10;

将其包装到派生表中:

SELECT coalesce(SUM(X.Count)*3600, 0) AS PJZ, X.Mass
FROM X
WHERE X.Mass > 2000
HAVING ((X.Mass / coalesce(SUM(X.Count)*3600, 0) * 100) - 100) >= 10; 

(请注意,我添加了缺少的group by,否则查询将无效)

其他选项是使用
语句将query by
包围起来-例如:

SELECT CASE 
          WHEN PJZ = 0 THEN 100
          ELSE PJZ
       END as PJZ,
       mass
FROM (
    SELECT CASE 
             WHEN SUM(X.Count)*3600 is null THEN '0'  
             ELSE SUM(X.Count)*3600  
           END AS PJZ,  
           X.Mass  
    FROM X  
    WHERE X.Mass > 2000  
    GROUP BY X.mass
) t
WHERE PJZ = 0 
   OR ((X.Mass / PJZ * 100) - 100) >= 10;

在我看来,它比代码复制好得多

,但现在我遇到了被零除的问题。PJZ可以是零。然后排除PJZ为零的行。或者根据您的要求,在CASE语句中返回1(或任何其他非零值),我不能排除这些行,因为我也想看到它们。如果PJZ为0,则:((X.Mass/PJZ*100)-100)应该为我显示100。所以我还需要另一个。。。
WITH x as (
  SELECT coalesce(SUM(X.Count)*3600, 0) AS PJZ, X.Mass
  FROM X
  WHERE X.Mass > 2000
)
SELECT * from X WHERE PJZ >=10