627.Swap Salary-(LeetCode之Database篇)

问题描述


给出下面的表,名为salary

idnamesexsalary
1Am2500
2Bf1500
3Cm5500
4Df500

要求执行一个UPDATE语句,将表转换成下面的样子。

idnamesexsalary
1Af2500
2Bm1500
3Cf5500
4Dm500

即m与f交换位置。
 
 

问题解决


下面我使用SQL中的case when来解决问题。

#简单case函数写法
update salary
set sex = (case sex 
           when 'm' then 'f'
           else 'm'
           end)
#case搜索函数写法
update salary
set sex = (case  
           when sex = 'm' then 'f'
           else 'm'
           end)

这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。

进入讨论区后发现很多大神还有其它优秀的解决方案。例如:

UPDATE salary 
SET sex = IF(sex='m','f','m')

当表中的某个字段只有两种情况时,可以使用上面的解法。

还有一种解法真是震惊到我了,那就是采用异或的思路。异或有两条规则是:

  • 两个相同的数异或为0
  • 0与任何数异或还是原数

所以就有了下面的解法:

update salary 
set sex = CHAR(ASCII('f') ^ ASCII('m') ^ ASCII(sex))

如果sex为‘m’,三个数做异或后结果结果就为‘f’,这个解法真是相当巧妙。

这里写图片描述

可以看到这四种方式的运行速度快慢,使用异或的速度是最快的,IF函数的方式速度也还行,不过它只适用于字段只有两种可能的情况。而case when函数是我们最容易想到的,但是其运行速度就稍微的差了点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值