题目
给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。
注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。
例如:
id
name
sex
salary
1
A
m
2500
2
B
f
1500
3
C
m
5500
4
D
f
500
运行你所编写的更新语句之后,将会得到以下表:
id
name
sex
salary
1
A
f
2500
2
B
m
1500
3
C
f
5500
4
D
m
500
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-salary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
虽然不知道为什么这么写。。但自己写的。。居然通过了。。
---- MySQL ----
# Write your MySQL query statement below
update salary set sex =
case when sex = 'm' then 'f'
when sex = 'f' then 'm' end ---- 119ms
Oracle提交也可以通过,不过执行很慢,1151ms。
看到一个神操作,通过ascii码转换,再通过char转换为字符串,666!
---- MySQL ----
update salary set sex =
char(ascii('f') + ascii('m') - ascii(sex)); ---- 118ms
还有通过异或运算得到结果的。
---- MySQL ----
update salary set sex =
char(ascii(sex)^ascii('f')^ascii('m')); ---- 120ms
异或运算:当2个相同的值进行异或运算,结果为0。
使用MySQL的if函数,if(sex = 'm', 'f', 'm')也可以。
---- MySQL ----
update salary set sex =
if(sex = 'm', 'f', 'm');
使用oracle的decode函数。
---- oracle ----
update salary set sex =
decode(sex, 'm', 'f', 'f', 'm');
思考
使用update和case...when...进行动态将值设置成列。
通过ascii码转换,再通过char转换为字符串。
使用异或运算进行解答。
使用常规的if和decode进行解答。