为什么我得到列 "ended" 不存在?

Why am I getting column "ended" does not exist?

我正在尝试在 SQL 中执行条件 ORDER BY,但出现错误:column "ended" does not exist 指向查询的 'case when "ended"' 部分。

这是我的查询:

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时未定义列ended,sql按下一个顺序执行查询:

  1. 来自
  2. 哪里
  3. 订单
  4. select

因此,您需要将完整表达式复制到 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

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

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))

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

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

  • PostgreSQL Where count condition

相关范例:

  • PostgreSQL: running count of rows for a query 'by minute'

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