[leetcode/db] 627 swap salary

Swap all f and m values (i.e., change all f values to m and vice versa) with a single update query and no intermediate temp table.

Problem

Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m values (i.e., change all f values to m and vice versa) with a single update query and no intermediate temp table.

For example:

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

After running your query, the above salary table should have the following rows:

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

Solution

Using the keyword CASE could solve the problem easily.

UPDATE salary
SET
sex = CASE sex
WHEN 'f' THEN 'm'
ELSE 'f'
END;

CASE

CASE evaluates a list of conditions and returns one of multiple possible result expressions.
It has two formats:

  • The simple CASE expression, which compares an expression to a set of simple expressions to determine the result.
    CASE input_expression
    WHEN when_expression THEN result_expression [ ...n ]
    [ ELSE else_result_expression ]
    END
    
  • The searched CASE expression, which evaluates a set of Boolean expressions to determine the result.
    CASE
    WHEN Boolean_expression THEN result_expression [ ...n ]
    [ ELSE else_result_expression ]
    END
    

Conclusion

CASE is very similar to ‘case’ expressions in other programming languagues.
For this problem, we use the simple CASE expression, but in fact both could be applied.

Reference

1. CASE (Transact-SQL)