SQL Server:如何根据cl1自身值与FL列值更新cl1多值
正确实现SQL Server中基于多条件的列更新
你的问题出在几个关键地方:一是在SET里多次给cl1赋值,SQL会只保留最后一次赋值逻辑,完全打乱了你想要的匹配规则;二是字符串常量没加单引号(比如20gs应该写成'20gs'),数据库会把它当成对象名而非字符串值;另外还注意到你写的cl1 = '11rx'应该是笔误,对应规则里的'14rx'对吧?
下面是修正后的正确写法,我们把所有cl1的匹配逻辑整合到一个CASE语句里,同时保留FL的过滤条件:
UPDATE your_table_name SET cl1 = CASE WHEN cl1 = '15g0' THEN '20gs' WHEN cl1 = '22g0' THEN '22gs' WHEN cl1 = '14rx' THEN '14rs' ELSE cl1 -- 如果没有匹配的情况,保持原数值不变 END WHERE FL IN ('m31', 'm28') -- 用IN比多个OR更简洁高效
关键点说明:
- 把所有
cl1的转换规则放在同一个CASE语句中,数据库会按顺序匹配条件,找到第一个符合的就返回对应值,逻辑清晰且不会出现多次赋值的冲突问题。 - 添加
ELSE cl1是为了避免那些不满足转换规则的cl1值被意外改成NULL,如果不需要保留原数值,可以去掉这部分,但通常建议加上来保证数据安全。 - 用
FL IN ('m31', 'm28')替代原来的多个OR,写法更简洁,性能上也和OR等价(SQL Server会自动优化)。
另外,为了避免误操作,你可以先运行一个SELECT语句验证转换结果:
SELECT cl1 AS original_cl1, CASE WHEN cl1 = '15g0' THEN '20gs' WHEN cl1 = '22g0' THEN '22gs' WHEN cl1 = '14rx' THEN '14rs' ELSE cl1 END AS new_cl1, FL FROM your_table_name WHERE FL IN ('m31', 'm28')
确认转换结果正确后再执行UPDATE,这样更稳妥。
内容的提问来源于stack exchange,提问作者Ouskiffprog
相关产品推荐
相关产品推荐

