2013-07-30 87 views
0

我試圖在Mysql中使用CASE語句,雖然MySQL不會抱怨我的查詢,但它無法提供正確的結果。爲什麼MySQL Switch-Case沒有選擇正確的值?

什麼我試圖做的是等價的:

if value < 20 then 1 
elseif value < 30 then 2 
elseif value < 40 then 3 
. 
. 
. 
else value < 90 then 45 

,這是我的MySQL聲明:

SELECT 
    UM.DA, 
    UM.PA, 
    IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) AS "PS", 
CASE 
    WHEN "PS" < 20 THEN 1 
    WHEN "PS" < 30 THEN 2 
    WHEN "PS" < 40 THEN 3 
    WHEN "PS" < 50 THEN 5 
    WHEN "PS" < 60 THEN 8 
    WHEN "PS" < 70 THEN 12 
    WHEN "PS" < 80 THEN 20 
    WHEN "PS" < 90 THEN 30 
    WHEN "PS" >= 90 THEN 45 
END AS "Points", 
FROM 
    Table1 UM 

,這是我的結果集:

+-------+-------+--------+--------+ 
| UM.DA | UM.PA | PS | Points | 
+-------+-------+--------+--------+ 
| 19.21 | 18.39 | 18.39 | 1 | 
+-------+-------+--------+--------+ 
| 24.80 | 34.91 | 34.91 | 1 | 
+-------+-------+--------+--------+ 
| 29.72 | 35.89 | 35.89 | 1 | 
+-------+-------+--------+--------+ 

這就是我的結果應該如何:

+-------+-------+--------+--------+ 
| UM.DA | UM.PA | PS | Points | 
+-------+-------+--------+--------+ 
| 19.21 | 18.39 | 18.39 | 1 | 
+-------+-------+--------+--------+ 
| 24.80 | 34.91 | 34.91 | 3 | 
+-------+-------+--------+--------+ 
| 29.72 | 35.89 | 35.89 | 3 | 
+-------+-------+--------+--------+ 

那麼,什麼是在MySQL查詢中使用「CASE」(這是一個查詢,而不是存儲過程)

另外,在性能方面是它更好地把這種邏輯在SQL的正確方法查詢,還是應該用我選擇的編程語言過濾結果?

謝謝!

+0

爲什麼你在包含PS的時候在Case-When語句中使用雙引號?這是一個專欄名稱。 –

+0

因爲MySQL的抱怨,如果我不 – ILikeTacos

回答

2

嘗試這種情況:

SELECT DA, PA, PS, 
     CASE 
      WHEN PS < 20 THEN 1 
      WHEN PS < 30 THEN 2 
      WHEN PS < 40 THEN 3 
      WHEN PS < 50 THEN 5 
      WHEN PS < 60 THEN 8 
      WHEN PS < 70 THEN 12 
      WHEN PS < 80 THEN 20 
      WHEN PS < 90 THEN 30 
      ELSE 45 
     END AS "Points" 
FROM (SELECT DA, PA, 
      IF((DA - PA) > 25, DA, PA) AS PS 
     FROM Table1 UM) temp 

它移動PS計算爲子查詢,因此它可以在CASE表達而不重複所述計算被引用。而PS必須是名稱,而不是字符串。

+0

我的MySQL版本抱怨,如果我不刪除引號,它返回「未知列PS在字段列表中「 – ILikeTacos

+0

這是因爲您不能在定義的同一個SELECT列表中引用別名。這就是爲什麼我在我的答案中將其轉移到子查詢中的原因。 – Barmar

+0

你應該在這裏使用反引號'UM.DA',否則它會被認爲是表格和列 –

0

"PS"只是一個字符串。它不是你創建的別名,所以你將一個字符串與一個整數進行比較,並且mysql會自動將該字符串轉換爲一個int,使其爲0,因此所有的情況都匹配。你想

CASE 
    WHEN PS < 20 THEN 1 
     ^^---note lack of quotes 
+0

你不能引用別名在同一選擇 – Bohemian

+0

是的,那也... –

0

我不認爲你可以使用一個別名的查詢內的列,除非它是ORDER BY子句。因此(特別是由於語音標記的別名而不是反引號),您正在進行字符串比較。查詢更改爲:

SELECT 
    UM.DA, 
    UM.PA, 
    IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) AS "PS", 
CASE 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 20 THEN 1 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 30 THEN 2 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 40 THEN 3 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 50 THEN 5 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 60 THEN 8 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 70 THEN 12 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 80 THEN 20 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 90 THEN 30 
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) >= 90 THEN 45 
END AS "Points", 
FROM 
    Table1 UM 
相關問題