题目
给定一个 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 |
审题
确定题目不应该是交换性别?
其实就是将sex字段的f与m交换
但有很多前提条件
只能写一个 Update 语句,请不要编写任何 Select 语句。
Update的语法
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
自己的解答
首先想到的就是if函数 if(sex = 'f', 'm', 'f')
update salary
set sex = if(sex = 'f', 'm', 'f')
还可以用mysql中的控制语句 case
回顾一下case的语法
情况一: 类似于switch语句
case 表达式
when 值1 then 结果1
when 值2 then 结果2
...
else 结果n
end
情况二、 类似于多重if语句 实现区间判断
case
when 条件1 then 结果1
when 条件2 then 结果2
...
else 结果n
end
那么就可以这样实现
update salary
set sex = case sex
when 'f' then 'm'
else 'f'
end
别的解答
每个字母都对应的是一个asc码
char(ascii('m') + ascii('f') - ascii(sex)) 即可实现交换
update salary
set sex = char(ascii('m') + ascii('f') - ascii(sex));