本题应用的是 MySQL8.0,没有在 MySQL5.6 版本中测验过,不保障正确。
题目
题目起源:性别变更
将所有数据 sex
的 f
和 m
对换,仅应用单个 update
语句,且不产生两头长期表
create table salary (
id int primary key,
name varchar(255),
sex varchar(255),
salary int
)
insert into salary values
(1, 'A', 'm', 2500),
(2, 'B', 'f', 1500),
(3, 'C', 'm', 5500),
(4, 'D', 'f', 500);
SQL:办法一
update salary set sex = case sex when 'm' then 'f' else 'm' end;
解析
如果 sex = 'm'
,那么就设置为 f
,否则设置为 m
。
应用 case sex when 'm' then 'f' else 'm' end
就能够实现
SQL:办法二
update salary set sex = if(sex = 'm', 'f', 'm');
解析
思路和办法一一样
这是应用 if(sex = 'm', 'f', 'm')
SQL:办法三
update salary set sex = char(ascii(sex) ^ ascii('m') ^ ascii('f'));
解析
每一个字母都对应一个 ascii
,应用 ascii()
就能够把字母转换成 ascii
。
在利用异或,雷同的数为 0
,0
和任何数进行异或都是那个数。
再利用 char
将 ascii
码转换成字母
具体的步骤:
ascii('m')
为109
,ascii('f')
为102
ascii('m') ^ ascii('m') ^ ascii('f')
,所以转化成109 ^ 109 ^ 102
,109
和109
异或为0
,0
和102
异或为102
,在用char(102)
得出后果为m
。ascii('f') ^ ascii('m') ^ ascii('f')
,所以转化成102 ^ 109 ^ 102
,能够替换下109
和102
的地位,所以102
和102
异或为0
,0
和109
异或为109
,在用char(109)
得出后果为f
。
更多解题参考:https://github.com/astak16/bl…