【问题标题】:Why am I getting column "ended" does not exist?为什么我得到列“结束”不存在?
【发布时间】:2015-11-03 23:06:47
【问题描述】:

我正在尝试在 SQL 中执行条件 ORDER BY,但出现错误:column "ended" does not exist 指向查询的“结束”部分的情况。

这是我的查询:

SELECT (EXTRACT(EPOCH FROM SUBMISSION_DEADLINE)
       -EXTRACT(EPOCH FROM now())) AS "datediff"
    , (EXTRACT(EPOCH FROM SUBMISSION_DEADLINE)>EXTRACT(EPOCH FROM now())) AS "ended", *
FROM imdown_api_v1_contest
ORDER BY "ended" DESC, case when "ended" = true then "datediff" else "-datediff" END ASC;

我需要先抓住尚未结束的比赛,然后按最先结束的比赛排序。然后我需要所有已经结束的,并按最近结束的排序。

【问题讨论】:

  • 一种选择是将您的查询(不带order by)移动到子查询中,然后将order by 添加回来。那应该可以识别ended 列...

标签: sql postgresql sql-order-by


【解决方案1】:

执行order by时未定义列ended,sql按下一个顺序执行查询:

  1. 来自
  2. 在哪里
  3. 订购
  4. 选择

因此,您需要将完整表达式复制到 order by 子句中或使用子查询,例如:

select * from (
    SELECT (EXTRACT(EPOCH FROM SUBMISSION_DEADLINE)-EXTRACT(EPOCH FROM now())) AS "datediff", (EXTRACT(EPOCH FROM SUBMISSION_DEADLINE)>EXTRACT(EPOCH FROM now())) AS "ended", *
    FROM imdown_api_v1_contest
) tmpq
ORDER BY "ended" DESC, case when "ended" = true then "datediff" else "-datediff" END ASC

【讨论】:

    【解决方案2】:

    您的查询在多个地方被破坏或效率低下,而不仅仅是对列别名的非法引用。这可能会如你所愿:

    SELECT EXTRACT(EPOCH FROM now() - submission_deadline) AS datediff
         , now() > submission_deadline AS ended  -- I inverted your expression!
         , *
    FROM   imdown_api_v1_contest
    ORDER  BY 2  -- positional reference to output column
         , @(EXTRACT(EPOCH FROM now() - submission_deadline))
    

    通常,“结束”的比赛在过去中有一个submission_deadline,所以now() > submission_deadline AS ended,而不是相反。

    为了修复您的主要语法错误,我使用位置引用而不是列别名。详细解释:

    相关示例:

    为了达到您想要的订单,我使用absolute value operator @

    【讨论】:

    • 有没有办法让这些与 LIMIT 和 OFFSET 子句一起工作?
    • @Tyler:我没有看到LIMITOFFSET 的问题......也许开始一个新问题来清楚地展示你的情况?无论哪种方式,请考虑手头问题的更新查询。
    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 2021-01-07
    • 2018-02-25
    • 2018-04-19
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多