【问题标题】:not recognizing alias in WHERE clause [duplicate]无法识别 WHERE 子句中的别名 [重复]
【发布时间】:2018-07-19 17:40:30
【问题描述】:

我正在尝试查询以下信息。如果没有 WHERE 子句,查询将完美执行;但是,当我添加 WHERE 子句时,我收到一个错误,别名“error_percentage”未被识别。我还尝试使用 HAVING 代替 WHERE,以及 LIMIT。

我应该如何使用我在 SELECT 子句中创建的别名来缩小查询范围?

SELECT date, ((CAST(error AS float) / CAST(success AS float)) *100) AS error_percentage
FROM daily_report
WHERE error_percentage > 1
ORDER BY error_percentage DESC;

谢谢!

【问题讨论】:

  • 您是在使用 mysql、postgresql 还是两者都使用,或者您是否放错了 psql 标签?
  • 我正在使用 PostgreSQL,但由于操作顺序,我发现我同时应用了这两个问题。

标签: sql postgresql alias


【解决方案1】:

在构造结果集之前无法访问列别名(此处为:error_percentage)。 ORDER BY 不受影响,因为排序发生(必然)_after_the 结果集已被检索。

使用

SELECT agg.*
  FROM (
          SELECT date, ((CAST(error AS float) / CAST(success AS float)) *100) AS error_percentage
            FROM daily_report
        ORDER BY error_percentage DESC
       ) agg
 WHERE error_percentage > 1
     ;

如果你先修剪结果集,它会更有效,可能更干净:

  SELECT agg.*
    FROM (
            SELECT date, ((CAST(error AS float) / CAST(success AS float)) *100) AS error_percentage
              FROM daily_report
         ) agg
   WHERE error_percentage > 1
ORDER BY error_percentage DESC
     ;

【讨论】:

  • 效果很好,除了我必须删除“DESC”之后的分号
  • 是的,对不起,复制粘贴错字;)
【解决方案2】:

我只想用一个表达式替换where

SELECT date,
       ((CAST(error AS float) / CAST(success AS float)) *100) AS error_percentage
FROM daily_report
WHERE error > 0.01 * success
ORDER BY error_percentage DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多