DEV Community

Ibrahim
Ibrahim

Posted on

Using CASE to Sort ENUM Values in MySQL

There is a tasks table. It has a status column of type enum(todo, inprogress, done)

SELECT * FROM tasks;
-- +----+----------------------+------------+
-- | id | name                 | status     |
-- +----+----------------------+------------+
-- |  1 | Write blog post      | todo       |
-- |  2 | Fix bug #342         | inprogress |
-- |  3 | Design homepage      | done       |
-- |  4 | Update documentation | todo       |
-- |  5 | Deploy to staging    | inprogress |
-- |  6 | Plan sprint meeting  | done       |
-- |  7 | Refactor codebase    | todo       |
-- |  8 | Test new features    | inprogress |
-- |  9 | Clean up database    | done       |
-- | 10 | Create wireframes    | todo       |
-- +----+----------------------+------------+
-- 10 rows in set (0.01 sec)
Enter fullscreen mode Exit fullscreen mode

Suppose we want to select all the tasks sorted by the status — inprogress comes first, todo second, and done last.

If we use ORDER BY status, the tasks will be sorted based on the index in the enum definition. So the result will be todo comes first, inprogress second, and done last. For example:

SELECT * FROM tasks
ORDER BY status;
-- +----+----------------------+------------+
-- | id | name                 | status     |
-- +----+----------------------+------------+
-- |  1 | Write blog post      | todo       |
-- |  4 | Update documentation | todo       |
-- |  7 | Refactor codebase    | todo       |
-- | 10 | Create wireframes    | todo       |
-- |  2 | Fix bug #342         | inprogress |
-- |  5 | Deploy to staging    | inprogress |
-- |  8 | Test new features    | inprogress |
-- |  3 | Design homepage      | done       |
-- |  6 | Plan sprint meeting  | done       |
-- |  9 | Clean up database    | done       |
-- +----+----------------------+------------+
-- 10 rows in set (0.00 sec)
Enter fullscreen mode Exit fullscreen mode

To solve this, we can use the CASE clause in ORDER BY. In the CASE clause, each value in the enum becomes a condition and is assigned a number. The smallest number will appear first in the order.

For example:

SELECT * FROM tasks
ORDER BY CASE
    WHEN status = 'inprogress' THEN 1
    WHEN status = 'todo' THEN 2
    ELSE 3
END;
-- +----+----------------------+------------+
-- | id | name                 | status     |
-- +----+----------------------+------------+
-- |  2 | Fix bug #342         | inprogress |
-- |  5 | Deploy to staging    | inprogress |
-- |  8 | Test new features    | inprogress |
-- |  1 | Write blog post      | todo       |
-- |  4 | Update documentation | todo       |
-- |  7 | Refactor codebase    | todo       |
-- | 10 | Create wireframes    | todo       |
-- |  3 | Design homepage      | done       |
-- |  6 | Plan sprint meeting  | done       |
-- |  9 | Clean up database    | done       |
-- +----+----------------------+------------+
-- 10 rows in set (0.00 sec)
Enter fullscreen mode Exit fullscreen mode

As we can see in the result, the tasks are sorted by the status column — inprogress comes first, todo second, and done last.

Here's the syntax to use the CASE clause:

CASE  
    WHEN  condition1  THEN  condition1value  
    WHEN  condition2  THEN  condition2value
    WHEN  conditionN  THEN  conditionNvalue  
    ELSE  otherconditionvalue  
END;
Enter fullscreen mode Exit fullscreen mode

Summary

The example above is how to sort data by enum values in MySQL using the CASE clause. There are other ways to solve this problem — for example, we can use the FIELD function, modify the enum order, and so on.

Top comments (0)