改工资MySQL_leetcode MySQL 实现交换工资问题

这篇博客讨论了如何使用MySQL的UPDATE语句一次性交换salary表中的性别,提供了CASE WHEN和ASCII转换的方法,强调在不使用SELECT语句和中间表的情况下解决此类问题。
摘要由CSDN通过智能技术生成

leetcode MySQL 实现交换工资问题,不是很难,但是有一个解题思路特别有意思。

题目分析

因为题目不是很长,这里把题目贴出来:

给定一个 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 |

题目意思很简单,就是交换性别,将原来所有是男生的变成女生,所有女生变成男生,而且只能用一个 UPDATE 语句实现,任何 SELECT 语句都不能出现,意味着不能先查询后更新,必须是一次性实现这个效果。

参考答案

首先,如果熟悉 MySQL 语法的很容易想到用 IF 或者 CASE WHEN,答案如下:

-- 使用 CASE

UPDATE salary

SET sex = CASE

WHEN sex = 'm' THEN 'f'

ELSE 'm'

END;

-- 使用 IF

UPDATE salary

SET sex = if(sex = 'f', 'm', 'f');

如果对 CASE WHEN 和 IF 语法不熟悉的,可以再换种思路。交换“性别”,我们可以转换为代码中的交换“变量”,不能用到 SELECT ,不就很像在代码中交换“变量”时,不能引入其他变量吗?于是,这个题目就转换为:

如何在不引入中间变量的情况下,交换两个变量的值呢?

你可能会说,在 Python 中本来就不需要中间变量,一行代码就搞定:

a, b = b, a

但如果是其他语言呢?或者让你来实现 Python 的这种方式呢?很明显也是有方法的,这也是经常会遇到的一个笔试题,关键点在于:

b = a + b - a

a = a + b - b

# 交换变量,只需要交换

a = a + b

b = a - b # b 变成了 a

a = a - b # a 变成了 b

利用这一个思想,我们只需要拿到和,再用 “和” 减去当前的 “性别”,即可改变性别。而这里的 “性别” 是字符,显然字符是可以转换为 ascii 变为对应的数字的,因此题目就变得简单了,答案如下:

UPDATE salary

SET sex = char(ascii('f') + ASCII('m') - ASCII(sex));

总结

注意 “和” 的思想

代码中如何实现不引入其他变量达到变换变量的目的,对于这一实现,除了上面说的方式,还有另外一种,即按位异或,即思想是一样的,只是把 “+” 换成 “^”。参考如下:

a = a ^ b

b = a ^ b

a = a ^ b

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值