如何在SQL UPDATE时仅匹配CASE条件执行更新,省略ELSE子句?
问题解答
不能直接省略ELSE fieldname部分——如果省略,CASE表达式会返回NULL,这会把所有不匹配CASE分支的行的fieldname字段直接设为NULL,完全不符合你“其余字段保持原有状态”的需求。
不过你不想在WHERE子句里重复所有匹配条件的诉求是可以解决的,给你两个优化方案:
方案1:保留ELSE+简化WHERE条件
把CASE里的所有匹配值用IN子句整合到WHERE里,不用重复写每个WHEN的条件,同时保留ELSE确保不匹配的行(实际会被WHERE过滤掉,ELSE不会触发)值不变:
UPDATE tablename SET fieldname = CASE fieldname WHEN 'foo' THEN 'bar' WHEN 'baz' THEN 'bam' -- 其他需要替换的分支 ELSE fieldname END WHERE fieldname IN ('foo', 'baz'/*, 其他需要匹配的值*/);
方案2:省略ELSE+精准过滤
既然WHERE已经限定了fieldname是CASE里的那些值,CASE必然会匹配到某个WHEN分支,不会走到ELSE,所以可以直接省略ELSE,代码更简洁:
UPDATE tablename SET fieldname = CASE fieldname WHEN 'foo' THEN 'bar' WHEN 'baz' THEN 'bam' -- 其他需要替换的分支 END WHERE fieldname IN ('foo', 'baz'/*, 其他需要匹配的值*/);
这两种方案都能避免重复写大量匹配条件,同时保证只有需要更新的行被处理,既满足需求又优化了性能(不会扫描所有行)。
内容的提问来源于stack exchange,提问作者chx
相关产品推荐
相关产品推荐

