How to Use the CASE Statement in SQL (With Examples)
What is the CASE statement in SQL?
We often need to implement conditional logic for data transformation and classification within SQL queries. In such cases, the SQL CASE statement serves as a versatile and powerful tool for implementing if-then-else logic directly within queries. It allows different output values based on specified conditions, making queries more flexible and readable.
Consider a scenario where a company wants to classify employees based on their performance ratings stored in a database. A straightforward but inefficient approach would be to write separate queries for each classification like this:
SELECT employee_name, 'Outstanding' AS performance_categoryFROM employees WHERE rating > 90;SELECT employee_name, 'Exceeds Expectations' AS performance_categoryFROM employees WHERE rating BETWEEN 70 AND 90;SELECT employee_name, 'Needs Improvement' AS performance_categoryFROM employees WHERE rating < 70;
While this method works, it requires multiple queries, making maintenance and execution of the SQL queries challenging. The CASE statement in SQL simplifies this by enabling dynamic classification within a single query, improving efficiency and readability.
Now, let’s break down the syntax of the CASE statement and explore how it works.
Syntax of the CASE statement
The CASE statement in SQL follows a straightforward structure that resembles conditional statements in programming languages.
It can be implemented in two ways, depending on how conditions are evaluated:
Simple CASE
The simple CASE syntax compares an expression to a set of simple expressions sequentially and returns the result of the first match. If no match is found, it returns the value specified in the ELSE clause (or NULL if ELSE is omitted).
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
expression: The value or column being evaluated (optional in some cases).WHEN condition: Specifies a condition to check.THEN result: Defines the output if the condition is met.ELSE result: Provides a default result if no conditions match.END: Marks the end of theCASEstatement.
Searched CASE
The searched CASE statement evaluates multiple Boolean expressions and returns the result of the first condition that evaluates to TRUE. If none of the conditions match, it returns the value specified in the ELSE clause (or NULL if ELSE is omitted).
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
WHEN condition: EachWHENclause evaluates a Boolean expression.THEN result: Defines the output if the condition is met.ELSE result: Specifies a default result when no conditions match.END: Marks the end of theCASEstatement.
With the syntax covered, let’s explore how to use the CASE statement within SELECT and other key SQL clauses.
Using CASE within SELECT statements
The CASE statement is frequently used within SELECT queries to modify output dynamically. It helps in scenarios like conditional aggregation, custom sorting, and row-level transformations.
Let’s say we have an employees table like this:
| employee_id | employee_name | rating |
|---|---|---|
| 1 | Alice | 95 |
| 2 | Bob | 85 |
| 3 | Charlie | 70 |
| 4 | David | 60 |
| 5 | Emma | NULL |
Now, to classify employees based on their performance ratings stored in the database in a single SQL query, the SELECT statement would look like this:
SELECTemployee_name,CASEWHEN rating > 90 THEN 'Outstanding'WHEN rating BETWEEN 70 AND 90 THEN 'Exceeds Expectations'WHEN rating < 70 THEN 'Needs Improvement'ELSE 'Unrated'END AS performance_categoryFROMemployees;
The output will be:
| employee_name | performance_category |
|---|---|
| Alice | Outstanding |
| Bob | Exceeds Expectations |
| Charlie | Exceeds Expectations |
| David | Needs Improvement |
| Emma | Unrated |
Now that the basic usage of CASE with the SELECT statement in SQL is clear, let’s explore its application in other SQL statements.
CASE in WHERE, ORDER BY, and GROUP BY clauses
The CASE statement can also be used in different SQL clauses to add flexibility and control over query execution:
WHERE: Filters data based on conditional logic.ORDER BY: Dynamically sorts data based on custom conditions.GROUP BY: Categorizes records for aggregation.
Next, let’s explore these use cases with examples using an employees table as a reference:
Suppose the employees table is like this:
| employee_id | employee_name | department | salary | years_experience | total_purchases |
|---|---|---|---|---|---|
| 1 | Alice | Engineering | 90000 | 1 | 120 |
| 2 | Bob | Marketing | 50000 | 3 | 80 |
| 3 | Charlie | Engineering | 75000 | 6 | 40 |
| 4 | David | Marketing | 65000 | 5 | 150 |
| 5 | Eve | HR | 70000 | 8 | 20 |
Using CASE in WHERE (conditional filtering)
Let’s say we have to retrieve employees earning above department-specific salary thresholds:
- Engineering: Above $80,000
- Marketing: Above $60,000
- HR: No condition
Standard WHERE clauses apply the same condition across all rows, but CASE allows dynamic filtering based on column values. Here, different departments have different salary thresholds, which a simple WHERE cannot handle efficiently.
The SQL query combining CASE and WHERE will be as follows:
SELECT employee_name, department, salaryFROM employeesWHERECASEWHEN department = 'Engineering' AND salary > 80000 THEN TRUEWHEN department = 'Marketing' AND salary > 60000 THEN TRUEWHEN department = 'HR' THEN TRUEELSE FALSEEND;
The output will be:
| employee_name | department | salary |
|---|---|---|
| Alice | Engineering | 90000 |
| David | Marketing | 65000 |
| Eve | HR | 70000 |
Using CASE in ORDER BY (custom sorting)
Let’s say we have to sort employees by their total purchases, giving higher priority to:
- Frequent buyers (purchases > 100)
- Moderate buyers (50-100 purchases)
- Other buyers (remaining employees)
Sorting typically follows a fixed column order (e.g., by salary or date). CASE allows dynamic sorting based on categories, such as prioritizing high-value customers over low-value ones. Here, employees are sorted by purchase behavior, ensuring frequent buyers appear first.
The SQL query combining CASE and ORDER BY will be as follows:
SELECT employee_name, total_purchasesFROM employeesORDER BYCASEWHEN total_purchases > 100 THEN 1WHEN total_purchases BETWEEN 50 AND 100 THEN 2ELSE 3END, total_purchases DESC;
The output will be:
| employee_name | total_purchases |
|---|---|
| David | 150 |
| Alice | 120 |
| Bob | 80 |
| Charlie | 40 |
| Eve | 20 |
Using CASE in GROUP BY (dynamic categorization)
Suppose we need to categorize employees based on experience levels and count how many employees fall into each category.
- Beginner: Less than 2 years
- Intermediate: 2–5 years
- Expert: More than 5 years
GROUP BY normally aggregates data by fixed column values. CASE enables dynamic grouping by custom categories, such as grouping employees based on experience levels rather than exact years.
The SQL query combining CASE and GROUP BY will be as follows:
SELECTCASEWHEN years_experience < 2 THEN 'Beginner'WHEN years_experience BETWEEN 2 AND 5 THEN 'Intermediate'ELSE 'Expert'END AS experience_category,COUNT(*) AS employee_countFROM employeesGROUP BYCASEWHEN years_experience < 2 THEN 'Beginner'WHEN years_experience BETWEEN 2 AND 5 THEN 'Intermediate'ELSE 'Expert'END;
The output will be:
| experience_category | employee_count |
|---|---|
| Beginner | 1 |
| Intermediate | 2 |
| Expert | 2 |
The CASE statement is a powerful tool for conditional logic in SQL, but improper use can slow down queries, especially in large datasets. In the next section, let’s explore optimizing its usage to ensure better performance, readability, and maintainability.
Performance considerations and best practices
When using CASE statements in our SQL queries, we should keep these performance considerations and best practices in mind:
Indexing Impact:
- When used in a
WHEREclause,CASEcan prevent indexes from being utilized, leading to full table scans. - To maintain performance, filter indexed columns before applying
CASElogic.
- When used in a
Performance in
ORDER BYandGROUP BY:- In
ORDER BY,CASEcan dynamically sort results, but it forces row-by-row evaluation, slowing execution. - Using indexes on frequently sorted columns or precomputing sortable categories improves efficiency.
- In
GROUP BY, excessive use ofCASEcan make queries less maintainable and slower; consider using precomputed classifications.
- In
Readability and Maintainability:
- Avoid deeply nested
CASEstatements, which reduce clarity and make debugging difficult. - Use proper indentation and comments for complex conditions.
- Consider precomputing categorized fields in temporary tables or views.
- Avoid deeply nested
Understanding the impact of CASE statements on query performance is crucial for writing efficient and maintainable SQL queries. By optimizing their use, queries can run faster and remain scalable as datasets grow.
With these best practices in mind, let’s explore real-world applications of CASE to see how it enhances data analysis and decision-making in SQL.
Real-world applications of CASE
Some key real-world applications of CASE in SQL include:
Reporting Queries: The
CASEstatement is widely used in reporting dashboards to classify data dynamically. For example, customer demographics can be grouped into predefined categories based on age, spending habits, or subscription tiers, making reports more insightful and actionable.Financial Calculations: In financial applications,
CASEhelps implement tiered pricing models, tax brackets, or discount structures. Instead of writing multiple queries or complex joins,CASEallows financial institutions to apply conditional logic within a single SQL statement, ensuring accuracy and efficiency.E-Commerce Analytics: E-commerce platforms often use
CASEin analytics queries to segment users based on their purchase history, engagement level, or preferences. Businesses can optimize marketing strategies, personalize recommendations, and improve customer retention by prioritizing high-value customers or identifying inactive users.
By efficiently leveraging the CASE statement, organizations can streamline data processing, enhance decision-making, and improve query performance across various domains.
Conclusion
The SQL CASE statement is a powerful feature that brings conditional logic into SQL queries, enabling dynamic classification, filtering, sorting, and aggregation. By integrating CASE statement in SQL, complex data transformations can be handled within a single query, improving efficiency and readability.
Choosing between simple CASE and searched CASE, strategically using CASE in WHERE, ORDER BY, and GROUP BY clauses, and following best practices are key to writing optimized SQL queries. While CASE can introduce overhead if not used carefully, proper indexing and query structuring help maintain performance.
Mastering CASE in SQL allows developers and analysts to write more adaptable SQL queries, making data analysis more insightful and efficient across various industries, from financial modeling to customer analytics.
To explore more SQL concepts, check out the Learn SQL course by Codecademy.
'The Codecademy Team, composed of experienced educators and tech experts, is dedicated to making tech skills accessible to all. We empower learners worldwide with expert-reviewed content that develops and enhances the technical skills needed to advance and succeed in their careers.'
Meet the full teamRelated articles
- Article
SQL Execution Order Explained: How Queries Run Step-by-Step
Explore the SQL execution order step-by-step and understand how queries run behind the scenes. Learn how each step influences your results for optimal performance. - Article
JavaScript Switch Case vs If-Else Statement: When to Use Each
Learn when to use the JavaScript `switch` case and `if-else` statement for better code readability and efficiency. Make the right choice for your next project! - Article
How to Use the SQL Subquery: A Detailed Guide
Learn how to use subqueries in SQL for advanced data manipulation and analysis. Explore different types of SQL subqueries, usage methods, applications, and best practices.
Learn more on Codecademy
- Learn to analyze data with SQL and prepare for technical interviews.
- Includes 9 Courses
- With Certificate
- Beginner Friendly.18 hours
- In this SQL course, you'll learn how to manage large datasets and analyze real data using the standard data management language.
- Beginner Friendly.5 hours
- Use SQL to create, access, and update tables of data in a relational database.
- Beginner Friendly.2 hours