CASE
in SQL
The SQL CASE
statement enables conditional logic within queries, working like an if/then
structure in programming. It checks conditions and returns values based on which condition is met.
Basic Syntax
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE resultN
END
WHEN
: The condition to check.THEN
: The result if the condition is true.ELSE
: (Optional) Fallback result if none of the conditions match.END
: Marks the end of the CASE block.
Example
SELECT name,
CASE
WHEN age >= 60 THEN 'Senior'
WHEN age >= 30 THEN 'Adult'
ELSE 'Youth'
END AS age_group
FROM users;
This query groups users into age categories based on their age:
name | age_group |
---|---|
Alice | Youth |
Bob | Adult |
Carol | Senior |
David | Youth |
Emily | Senior |
CASE
with aggregate functions
This could be hard at the very first few times, we could try this template:
SELECT
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 29 THEN '18-29'
WHEN age >= 30 THEN '30+'
ELSE 'Unknown'
END AS age_group,
* -- Can be replaced by any aggregation function
FROM users
____ -- Can add a GROUP BY, ORDER BY, etc
For example:
SELECT
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 29 THEN '18-29'
WHEN age >= 30 THEN '30+'
ELSE 'Unknown'
END AS age_group,
COUNT(*) AS count
FROM users
GROUP BY
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 29 THEN '18-29'
WHEN age >= 30 THEN '30+'
ELSE 'Unknown'
END;
age_group | count |
---|---|
Under 18 | 4 |
18-29 | 10 |
30+ | 3 |
CASE
inside of aggregate functions
Example: using CASE
inside aggregate functions to pivot data horizontally
SELECT
COUNT(CASE WHEN age < 18 THEN 1 ELSE NULL END) AS under_18,
COUNT(CASE WHEN age BETWEEN 18 AND 29 THEN 1 ELSE NULL END) AS age_18_29,
COUNT(CASE WHEN age >= 30 THEN 1 ELSE NULL END) AS age_30_plus
FROM users;
under_18 | age_18_29 | age_30_plus |
---|---|---|
4 | 10 | 3 |
Reference
These notes are based on the Mode Intermediate SQL: CASE. I’ve written them to help myself quickly recall CASE
in SQL.