2012-03-22 50 views
2

我在这个查询我的Q是一个小问题,我如何检查状态where子句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

你能给我们多一点信息吗?你的桌子结构是什么? – 2012-03-22 16:52:25

+0

为什么你需要CASE语句? WHERE子句不会做同样的工作吗? – Simon 2012-03-22 16:53:45

+0

@Elachys查看我的更新 – 2012-03-22 16:58:47

回答

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分享你的经验 – 2012-03-22 17:04:25

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分享你的经验 – 2012-03-22 17:04:39

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分享你的经验 – 2012-03-22 17:06:54