Microsoft SQL环境下使用CASE语句同时更新多列的方案咨询
解答
初始查询运行说明
你编写的初始UPDATE查询无法正常运行。标准SQL以及SQL Server的T-SQL语法都不支持单个CASE表达式返回多组值同时赋值给多个列,该写法会直接触发语法报错。
你找到的逐列写CASE判断的更新方案语法是合法可运行的,仅缺点是重复写多轮相同的Column_1判断逻辑,代码冗余度高,后续维护修改也很麻烦。
SQL Server下更简洁的实现方案
你可以使用T-SQL的值表构造器(VALUES子句) 构建虚拟映射表,通过关联更新的方式实现需求,无需重复写判断逻辑,代码可读性和维护性都更好:
UPDATE t SET Column_3 = map.val3, Column_4 = map.val4, Column_5 = map.val5 FROM 你的实际表名 t INNER JOIN ( -- 这里直接按Column_1匹配值、对应Column3/4/5值的格式添加所有映射关系即可 VALUES ('First', 'first_col_3_val', 'first_col_4_val', 'first_col_5_val'), ('Second', 'second_col_3_val', 'second_col_4_val', 'second_col_5_val'), ('Tenth', 'tenth_col_3_val', 'tenth_col_4_val', 'tenth_col_5_val') ) AS map (match_col1, val3, val4, val5) ON t.Column_1 = map.match_col1
补充说明
你提到的MySQL中ON DUPLICATE KEY UPDATE类的特性,SQL Server对应有MERGE语法,但你当前是固定匹配值更新单表的场景,上述VALUES关联更新的方案比MERGE更简洁、性能开销也更低,不需要额外使用MERGE。
如果你的映射规则非常多,也可以先把映射关系存入临时表/实体映射表后再做关联更新,执行效率会比逐列写CASE的方案更高。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

