在 MySQL 中,UPDATE…CASE…WHEN…THEN 语句用于基于条件更新数据。这种语法使你能够在一条 UPDATE 语句中更新不同的字段值,依据每一行的条件来决定如何更新。相比于使用多条 UPDATE 语句一行行更新数据库,可以极大得提高性能。
语法结构:
UPDATE table_name
SET column_name = CASE
WHEN condition1 THEN value1
WHEN condition2 THEN value2
ELSE value3
END
WHERE some_condition;
实例
假设我们有一个名为 employees 的表,它有 id, name, salary 和 position 等字段。我们想要根据员工的职位来调整工资。
需求:
对于职位为 “Manager” 的员工,工资增加 1000。
对于职位为 “Developer” 的员工,工资增加 500。
对于其他职位的员工,工资保持不变。
SQL 语句:
UPDATE employees
SET salary = CASE
WHEN position = 'Manager' THEN salary + 1000
WHEN position = 'Developer' THEN salary + 500
ELSE salary
END;
更复杂情况:
你还可以使用多个 CASE 来更新不同的字段,或者在 WHEN 中使用更复杂的条件。例如:如果你想同时更新 salary 和 position 字段,可以这样做:
UPDATE employees
SET
salary = CASE
WHEN position = 'Manager' THEN salary + 1000
WHEN position = 'Developer' THEN salary + 500
ELSE salary
END,
position = CASE
WHEN position = 'Developer' THEN 'Senior Developer'
ELSE position
END;
但这个语句不是没有缺点:
- 应用层代码拼接这个SQL时,要注意这条长语句会不会长到MySql 的语句长度的上限
- 这个语句默认会更新所有行,因此需要在WHRER子句中添加IN等条件来过滤
- 这个语句会锁定很多行,也可能会锁表
参考