为什么我得到列 "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按下一个顺序执行查询:
- 来自
- 哪里
- 订单
- 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 @
。
我正在尝试在 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按下一个顺序执行查询:
- 来自
- 哪里
- 订单
- 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 @
。