Leetcode 647

Problem

Table: Salary

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| sex         | ENUM     |
| salary      | int      |
+-------------+----------+
id is the primary key for this table.
The sex column is ENUM value of type ('m', 'f').
The table contains information about an employee.

Write an SQL query to swap all 'f' and 'm' values (i.e., change all 'f' values to 'm' and vice versa) with a single update statement and no intermediate temporary tables.

Note that you must write a single update statement, do not write any select statement for this problem.

The query result format is in the following example.

Examples

Example 1:

Input: Salary table:

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

Output:

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

Explanation: (1, A) and (3, C) were changed from ’m’ to ‘f’. (2, B) and (4, D) were changed from ‘f’ to ’m’.

Solution

Method 1 - Using if

Code

Sql
UPDATE salary SET sex = IF(sex='f','m','f');

Method 2 - Using Case Expression

Code

Sql
UPDATE salary
SET sex = (CASE WHEN sex = 'm' 
                THEN 'f' 
                ELSE 'm'
           END)

Method 3 - Xor and Ascii

Code

Sql
update salary set sex = CHAR(ASCII('f') ^ ASCII('m') ^ ASCII(sex));

Method 4 - Ascii and Sum

Code

Sql
update salary set sex= CHAR(ASCII('f') + ASCII('m') - ASCII(sex));