1. 程式人生 > 其它 >資料更新--sql

資料更新--sql

資料更新--sql

假設現在需要根據以下條件對該表的資料進行更新。

  1. 對當前工資為 30 萬日元以上的員工,降薪 10%。
  2. 對當前工資為 25 萬日元以上且不滿 28 萬日元的員工,加薪 20%。

傳統方法

-- 條件一
UPDATE `user`
set 	salary = salary*0.9
WHERE salary < 300000.00;
SELECT *  FROM `user`

-- 條件二
UPDATE `user`
set 	salary = salary*1.2
WHERE salary > 250000.00 AND salary < 280000.00;
SELECT *  FROM `user`

上邊這種方法是不正確的

原因:例如這裡有一個員工,當前工資是 30 萬元,

按“條件 1”執行 UPDATE 操作後,工資會被更新為 27 萬元,

但繼續按“條件 2”執行 UPDATE 操作後,工資又會被更新為 32.4 萬元。

這樣,本來應該被降薪的員工卻被加薪了 2.4 萬元

即使將兩條 SQL 語句的執行順序顛倒一下,當前工資為 27 萬日元 的員工,其工資的更新結果也會出現問題。

為了避免這些問題,可以像下面這樣用 CASE 表示式來寫 SQL

CASE 表示式

-- 用 CASE 表示式寫正確的更新操作
UPDATE `user`
SET salary  = CASE 
	WHEN salary >= 300000
	THEN salary*0.9
	WHEN salary >=250000 AND salary <280000
	THEN salary*1.2
	-- ELSE salary非常重要,必須 寫上
	ELSE salary  END;
SELECT * FROM `user`;

注意

SQL 語句最後一行的 ELSE salary非常重要,必須 寫上。

因為如果沒有它,條件 1 和條件 2 都不滿足的員工的工資就會被更 新成 NULL。

圖例