本題使用的是 MySQL8.0,沒有在 MySQL5.6 版本中測驗過,不保證正確。
題目
題目來源:性別變更
將所有資料 sex
的 f
和 m
對換,僅使用單個 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
。
在利用異或,相同的數為 0
, 0
和任何數進行異或都是那個數。
再利用 char
將 ascii
碼轉換成字母
具體的步驟:
ascii('m')
為109
,ascii('f')
為102
ascii('m') ^ ascii('m') ^ ascii('f')
,所以轉化成109 ^ 109 ^ 102
,109
和109
異或為0
,0
和102
異或為102
,在用char(102)
得出結果為m
。ascii('f') ^ ascii('m') ^ ascii('f')
,所以轉化成102 ^ 109 ^ 102
,可以交換下109
和102
的位置,所以102
和102
異或為0
,0
和109
異或為109
,在用char(109)
得出結果為f
。