2015-11-03 3 views
0

Я пытаюсь сделать условие ORDER BY в SQL, но я получаю сообщение об ошибке: 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; 

мне нужно, чтобы захватить конкурсы, которые не закончились первыми и заказать те, по одному кончаться первым. Тогда мне нужны все те, которые закончились, и закажите те, которые закончились совсем недавно.

+0

Один из вариантов - переместить запрос (без 'order by') в подзапрос, а затем добавить' order by' обратно. Это должно признать колонку 'законченный' ... – sgeddes

ответ

1

Ваш запрос разбит или неэффективен в нескольких местах, а не только на незаконную ссылку на псевдоним столбца. Это может делать то, что вы собираетесь:

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 @.

+0

есть ли способ сделать эти работы с предложениями LIMIT и OFFSET? – Tyler

+0

@Tyler: Я не вижу проблемы для 'LIMIT' и' OFFSET' здесь ... Может, начните новый вопрос, чтобы четко представить свое дело? В любом случае, рассмотрите обновленный запрос для данного вопроса. –

+0

Это прекрасное спасибо! – Tyler

2

колонок 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 
+0

awesome это работает спасибо! – Tyler