2012-03-22 2 views
2

У меня есть небольшая проблема в этом запросе моего Q является как я проверить состояние в котором пунктMysql Запрос статус вопроса Неизвестного столбца

SELECT `id`,`name`,`start_date`,`end_date`, 
CASE 
WHEN SYSDATE() < `start_date` THEN 'WAITING'   
WHEN SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` THEN 'START' 
WHEN SYSDATE() >= `end_date` THEN 'END' 
END `status` 
FROM teams WHERE `status` = 'START'; 

Когда я выполнить этот запрос, они генерируют ошибку, как этот

enter image description here

скриншот

См база также

enter image description here

Помощник определенно оценен

+0

Не могли бы вы дать нам немного больше информации? Какова ваша структура таблицы? –

+0

Зачем вам нужен оператор CASE? Разве бы предложение WHERE не выполняло ту же работу? – Simon

+0

@Elachys см. Мое обновление –

ответ

4

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

SELECT `id`,`name`,`start_date`,`end_date`, `status` 
FROM (
    SELECT `id`,`name`,`start_date`,`end_date`, 
    CASE 
     WHEN SYSDATE() < `start_date` THEN 'WAITING'   
     WHEN SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` THEN 'START' 
     WHEN SYSDATE() >= `end_date` THEN 'END' 
    END `status` 
    FROM teams) AS T 
WHERE `status` = 'START'; 

Или вы можете дублировать логику в вашем предложении WHERE, но большинство людей предпочитают не делать этого. Также обратите внимание, что это решение позволяет просто изменить свое положение WHERE, чтобы получить другие наборы результатов:

  • WHERE status = 'WAITING'
  • WHERE status = 'END'

Вам не придется возиться с логикой после его настроен таким образом.

+0

Thanx для обмена опытом –

1

Попробуйте это, вы пытаетесь использовать столбец, который является псевдонимом

SELECT `id`,`name`,`start_date`,`end_date`, 
CASE 
WHEN SYSDATE() < `start_date` THEN 'WAITING'   
WHEN SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` THEN 'START' 
WHEN SYSDATE() >= `end_date` THEN 'END' 
END `status` 
FROM teams WHERE SYSDATE() between `start_date` and `end_date`; 
+0

Thanx для обмена опытом –

2

ли это не делать то же самое (я глава SQL Server так что простите меня, если я что-то или, если отсутствует синтаксис не 100%)?

SELECT `id`,`name`,`start_date`,`end_date`, 'START' AS `status` 
FROM Teams 
WHERE SYSDATE() >= `start_date` AND SYSDATE() <= `end_date` 
+0

Thanx для обмена опытом –

Смежные вопросы