SQL Review - Part 5
Tonight, I encountered a SQL question, and through this experience, I discovered the existence of the conditional function IF in SQL. This function allows performing a conditional check and returning different values based on the result of the condition. The syntax is as follows:
IF(condition, value_if_true, value_if_false)
Assume we have a table named employees with columns employee_id, name, and salary. We want to create a new column called bonus where employees with a salary greater than 5000 get a bonus of 1000, and others get a bonus of 500.
-- Creating the employees table
CREATE TABLE employees (
    employee_id INT,
    name VARCHAR(50),
    salary INT
);
-- Inserting some sample data
INSERT INTO employees VALUES
(1, 'Alice', 4800),
(2, 'Bob', 5200),
(3, 'Charlie', 4900);
-- Adding the bonus column using IF
SELECT 
    employee_id,
    name,
    salary,
    IF(salary > 5000, 1000, 500) AS bonus
FROM employees;
In this example, the IF function checks whether the salary is greater than 5000. If true, it returns 1000 as the bonus; otherwise, it returns 500. The result of the query would be:
| employee_id | name | salary | bonus | 
|---|---|---|---|
| 1 | Alice | 4800 | 500 | 
| 2 | Bob | 5200 | 1000 | 
| 3 | Charlie | 4900 | 500 | 
Exercise Problem
Let’s do the example below to practice our understanding.
Table: Employees
| Column Name | Type | 
|---|---|
| employee_id | int | 
| name | varchar | 
| salary | int | 
employee_id is the primary key (column with unique values) for this table. Each row of this table indicates the employee ID, employee name, and salary.
Write a solution to calculate the bonus of each employee. The bonus of an employee is 100% of their salary if the ID of the employee is an odd number and the employee’s name does not start with the character ‘M’. The bonus of an employee is 0 otherwise.
Return the result table ordered by employee_id.
The result format is in the following example.
Example 1:
Input: Employees table:
| employee_id | name | salary | 
|---|---|---|
| 2 | Meir | 3000 | 
| 3 | Michael | 3800 | 
| 7 | Addilyn | 7400 | 
| 8 | Juan | 6100 | 
| 9 | Kannon | 7700 | 
Output:
| employee_id | bonus | 
|---|---|
| 2 | 0 | 
| 3 | 0 | 
| 7 | 7400 | 
| 8 | 0 | 
| 9 | 7700 | 
Explanation: The employees with IDs 2 and 8 get 0 bonus because they have an even employee_id. The employee with ID 3 gets 0 bonus because their name starts with ‘M’. The rest of the employees get a 100% bonus.
My Solution
SELECT
    employee_id,
    IF(MOD(employee_id, 2) = 0 OR name LIKE 'M%', 0, salary) AS bonus
FROM
    Employees
ORDER BY
    employee_id
Editorial Solution
SELECT 
    employee_id,
    IF(employee_id % 2 = 1 AND name NOT REGEXP '^M', salary, 0) AS bonus 
FROM 
    employees 
ORDER BY 
    employee_id