如何用CASE语句正确更新指定ID表中的status和updated字段?
正确实现需求的SQL语句
首先,你原来的SQL存在几个语法和逻辑问题:
- CASE表达式缺少
END关键字,这属于语法错误,数据库无法正常解析 - UPDATE语句中只能有一个
SET关键字,多个字段的更新逻辑需要用逗号分隔,你写了两次SET是不符合语法规范的 - 你的CASE没有处理不满足条件的分支,这会导致当
status不等于'AAA'时,对应字段会被更新为NULL,而不是保持原有值
下面是修正后的正确SQL写法:
UPDATE my_table SET status = CASE WHEN status = 'AAA' THEN 'BBB' ELSE status END, updated = CASE WHEN status = 'AAA' THEN NOW() ELSE updated END WHERE id = 'abc123';
语句说明:
- 只保留一个
SET关键字,用逗号分隔两个字段的更新规则 - 每个CASE表达式都用
END闭合,同时在ELSE分支返回字段原有值,确保不满足条件时字段值保持不变 WHERE id='abc123'精准定位到目标行,避免误操作其他数据
另外还有一种更简洁的写法,通过WHERE条件直接过滤出需要更新的行:
UPDATE my_table SET status = 'BBB', updated = NOW() WHERE id = 'abc123' AND status = 'AAA';
这种写法的逻辑是:只有当id='abc123'且status='AAA'时才执行更新,不满足条件的话这条UPDATE不会对任何行产生影响,自然保持原值不变。这种写法效率更高,因为数据库直接过滤出目标行进行更新,不需要额外的条件判断。
你可以根据自己的习惯选择其中一种写法,两种都能实现你的需求。
内容的提问来源于stack exchange,提问作者anony..nvm
相关产品推荐
相关产品推荐

