day5 性別變更

uccs發表於2022-01-29

本題使用的是 MySQL8.0,沒有在 MySQL5.6 版本中測驗過,不保證正確。

題目

題目來源:性別變更

將所有資料 sexfm 對換,僅使用單個 update 語句,且不產生中間臨時表

create table salary (
    id int primary key,
    name varchar(255),
    sex varchar(255),
    salary int
)

insert into salary values
(1, 'A', 'm', 2500),
(2, 'B', 'f', 1500),
(3, 'C', 'm', 5500),
(4, 'D', 'f', 500);

SQL:方法一

update salary set sex = case sex when 'm' then 'f' else 'm' end;

解析

如果 sex = 'm' , 那麼就設定為 f ,否則設定為 m

使用 case sex when 'm' then 'f' else 'm' end 就可以實現

SQL:方法二

update salary set sex = if(sex = 'm', 'f', 'm');

解析

思路和方法一一樣

這是使用 if(sex = 'm', 'f', 'm')

SQL:方法三

update salary set sex = char(ascii(sex) ^ ascii('m') ^ ascii('f'));

解析

每一個字母都對應一個 ascii ,使用 ascii() 就可以把字母轉換成 ascii

在利用異或,相同的數為 00 和任何數進行異或都是那個數。

再利用 charascii 碼轉換成字母

具體的步驟:

  • ascii('m')109ascii('f')102
  • ascii('m') ^ ascii('m') ^ ascii('f') ,所以轉化成 109 ^ 109 ^ 102109109 異或為 00102 異或為 102 ,在用 char(102) 得出結果為 m
  • ascii('f') ^ ascii('m') ^ ascii('f') ,所以轉化成 102 ^ 109 ^ 102 ,可以交換下 109102 的位置,所以 102102 異或為 00109 異或為 109 ,在用 char(109) 得出結果為 f

更多解題參考:https://github.com/astak16/bl...

相關文章