无需使用CASE语句,用单条UPDATE语句互换Registration表Gender字段值
不用CASE语句实现Gender字段值互换的方案
嘿,刚好碰到过类似的需求!要把Registration表里Gender字段的M和F互换,还不能用CASE语句,这里有两个好用的办法:
方法一:嵌套REPLACE+临时占位符
核心思路是先把其中一个值换成临时标记,防止替换时互相覆盖,再完成互换:
-- 分两步执行,可读性更好 UPDATE Registration SET Gender = REPLACE(Gender, 'M', '_TEMP_') WHERE Gender = 'M'; UPDATE Registration SET Gender = REPLACE(Gender, 'F', 'M') WHERE Gender = 'F'; UPDATE Registration SET Gender = REPLACE(Gender, '_TEMP_', 'F') WHERE Gender = '_TEMP_';
或者把三个REPLACE嵌套成一行,一步到位:
UPDATE Registration SET Gender = REPLACE(REPLACE(REPLACE(Gender, 'M', '_TEMP_'), 'F', 'M'), '_TEMP_', 'F') WHERE Gender IN ('M', 'F');
方法二:利用ASCII码计算(更简洁)
观察一下ASCII码值:'M'的ASCII是77,'F'是70,两者相加刚好是147。所以我们可以通过计算得到另一个字符的ASCII码,再转成字符:
UPDATE Registration SET Gender = CHAR(147 - ASCII(Gender)) WHERE Gender IN ('M', 'F');
这个方法不需要临时值,代码更短,而且主流数据库(比如MySQL、SQL Server、PostgreSQL)都支持ASCII()和CHAR()函数,兼容性不错。
小提示
- 一定要加上
WHERE Gender IN ('M', 'F'),避免误改Gender为空或者其他异常值的记录,更安全。 - 执行UPDATE前,建议先用SELECT验证结果:
SELECT Id, Name, Gender, CHAR(147 - ASCII(Gender)) AS 转换后Gender FROM Registration WHERE Gender IN ('M', 'F');
内容的提问来源于stack exchange,提问作者Rakesh Kr Pandey
相关产品推荐
相关产品推荐

