627.Swap Salary-(LeetCode之Database篇)

问题描述


给出下面的表,名为salary

id name sex salary
1 A m 2500
2 B f 1500
3 C m 5500
4 D f 500

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

id name sex salary
1 A f 2500
2 B m 1500
3 C f 5500
4 D m 500

即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函数是我们最容易想到的,但是其运行速度就稍微的差了点。

原文地址:https://www.cnblogs.com/KKSJS/p/9622819.html