2012-03-22 80 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