一条 UPDATE 交换性别字段
LeetCode 627 · UPDATE + CASE、单语句修改
面试怎么回答
一条 UPDATE 加 CASE:sex = CASE sex WHEN 'm' THEN 'f' WHEN 'f' THEN 'm' ELSE sex END。同一条语句里每行只按原值计算一次,所以不会出现两步更新互相覆盖的问题。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
工资表里有性别字段,取值 m 或 f。只用一条 UPDATE 语句,把所有 m 改成 f、所有 f 改成 m。
表结构
- salary:id(主键)、name、sex(m / f)、salary
思路
如果写两条 UPDATE(先 m 改 f,再 f 改 m),第二条会把刚改过的也改回去。一条 UPDATE 里用 CASE 根据原值决定新值,每行只改一次,就不会互相影响。
参考解法
UPDATE salary
SET
sex = CASE sex
WHEN 'm' THEN 'f'
ELSE 'm'
END;
易错点
- 分两步更新会把所有值都变成同一个。
ELSE 'm'会把 m、f 以外的异常值也改成 m;更严谨的写法是WHEN 'f' THEN 'm' ELSE sex。