Mysql Query Issue Неизвестный статус столбца - PullRequest
2 голосов
/ 22 марта 2012

У меня есть небольшая проблема в этом запросе. Мой вопрос: как я могу проверить статус в предложении where

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

Помощь определенно приветствуется

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

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

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'

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

2 голосов
/ 22 марта 2012

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

SELECT `id`,`name`,`start_date`,`end_date`, 'START' AS `status`
FROM Teams 
WHERE SYSDATE() >= `start_date` AND SYSDATE() <= `end_date`
1 голос
/ 22 марта 2012

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

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`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...