astak16/blog-mysql

5 性别变更

Opened this issue · 0 comments

题目

将所有数据 sexfm 对换,仅使用单个 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

在利用异或,相同的数为 00 和任何数进行异或都是那个数。

再利用 charascii 码转换成字母

具体的步骤:

  • ascii('m')109ascii('f')102
  • ascii('m') ^ ascii('m') ^ ascii('f') ,所以转化成 109 ^ 109 ^ 102109109 异或为 00102 异或为 102 ,在用 char(102) 得出结果为 m
  • ascii('f') ^ ascii('m') ^ ascii('f') ,所以转化成 102 ^ 109 ^ 102 ,可以交换下 109102 的位置,所以 102102 异或为 00109 异或为 109 ,在用 char(109) 得出结果为 f