2014-09-18 69 views
1

這是我的表看起來像值在mysql中重新回到0更新查詢後

_____________________________________________________________ 
| id | val1 | val2 | val3 | val4 | val5 | val6 | 
|______|________|________|________|________|________|________| 
| 1 | 1300 | 1300 |  0 | 2000 | 1300 |  0 | 
|______|________|________|________|________|________|________| 
| 10 |  0 |  0 |  0 | 2000 |  0 |  0 | 
|______|________|________|________|________|________|________| 

現在我更新

UPDATE points set val5 = CASE WHEN id = 10 THEN val5 + 500 WHEN id = 1 THEN val5 + 500 END WHERE id IN ('10','1') 

這是我的表看起來像

_____________________________________________________________ 
| id | val1 | val2 | val3 | val4 | val5 | val6 | 
|______|________|________|________|________|________|________| 
| 1 | 1800 | 1800 |  0 | 2000 | 1800 |  0 | 
|______|________|________|________|________|________|________| 
| 10 | 500 | 500 |  0 | 2000 | 500 |  0 | 
|______|________|________|________|________|________|________| 
| 157 |  0 |  0 |  0 | 800 |  0 |  0 | 
|______|________|________|________|________|________|________| 

現在我再次更新(這是它破的地方)

UPDATE points set val5 = CASE WHEN id = 1 THEN val5 + 500 END, val6 = CASE WHEN id = 10 THEN val6 + 500 END WHERE id IN ('10','1') 

我的表看起來像這樣

_____________________________________________________________ 
| id | val1 | val2 | val3 | val4 | val5 | val6 | 
|______|________|________|________|________|________|________| 
| 1 | 2300 | 2300 |  0 | 2000 | 2300 |  0 | 
|______|________|________|________|________|________|________| 
| 10 | 1000 |  0 | 500 | 2000 |  0 | 500 | 
|______|________|________|________|________|________|________| 
| 157 |  0 |  0 |  0 | 800 |  0 |  0 | 
|______|________|________|________|________|________|________| 
| 158 |  0 |  0 |  0 | 800 |  0 |  0 | 
|______|________|________|________|________|________|________| 

你有沒有注意到VAL2和val5如何回到零,即使我沒有告訴它?我錯過了什麼?

+0

'id'是一個字符串還是數字? – Linger 2014-09-18 19:39:57

+0

我很抱歉,但我無法看到您的更新會如您的示例所示繼續添加行。 – 2014-09-18 19:45:05

+0

該部分是我正在顯示的查詢之前的另一個查詢 – 2014-09-19 00:35:31

回答

2

如果一個表達式與case中的任何when子句不匹配,則返回null,這不是您所期望的行爲。相反,你應該返回列本身在else條款:

UPDATE points 
SET val5 = CASE WHEN id = 1 THEN val5 + 500 ELSE val5 END, -- Notice the else 
     val6 = CASE WHEN id = 10 THEN val6 + 500 ELSE val6 END -- Here too 
WHERE id IN (10, 1) 
+0

** @ Mureinik **,在您的CASE語句中,您具有'id'作爲數字。在你的WHERE語句中,你將它作爲一個varchar。這是什麼? – Linger 2014-09-18 19:48:27

+0

@Linger從OP複製粘貼 - 謝謝,修正。 – Mureinik 2014-09-18 19:50:59

+0

非常感謝,我不敢相信我錯過了這一點 – 2014-09-18 20:00:05

1

對於你甚至不需要CASE語句的第一個查詢。下面應該工作:

UPDATE points 
SET val5 = val5 + 500 
WHERE id IN (10, 1) 

對於你必須有ELSE語句中的第二查詢:

UPDATE points 
SET val5 = CASE WHEN id = 1 THEN val5 + 500 ELSE val5 END, 
    val6 = CASE WHEN id = 10 THEN val6 + 500 ELSE val6 END 
WHERE id IN (10, 1) 

我注意到一兩件事。您在CASE聲明中使用id = 1id = 10。但是,您在WHERE語句中使用id IN ('10','1')。所以,id是一個字符串或數字。在我上面的例子中,我將它改爲了一個數字。