SQL CASE Explained

SQL CASE WHEN Explained — Conditional Logic Made Simple



The SQL CASE expression is the standard way to implement conditional logic inside queries. Think of it as an IF/ELSE for SQL — it lets you return different values depending on conditions. This beginner-friendly guide explains the two CASE forms (simple and searched), nested CASE, practical uses in SELECT and UPDATE, performance tips, and common mistakes.



Why use CASE?



Use CASE when you need to:



  • Map numeric codes to human-readable text (e.g., 1 → 'Active', 0 → 'Inactive')


  • Create buckets (e.g., score → 'Low', 'Medium', 'High')


  • Compute conditional aggregates


  • Apply different formatting or calculations in the result set

📽 Watch Video!

CASE Syntax — Two Forms



1. Simple CASE



CASE expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ELSE default_result
END
  


Use simple CASE when you compare one expression to constant values.



2. Searched CASE



CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ELSE default_result
END
  


Use searched CASE for complex conditions (ranges, multiple columns, functions).



Examples — SELECT with CASE



Example 1: Map status codes to text (Simple CASE)



SELECT OrderID,
       CASE Status
         WHEN 1 THEN 'Pending'
         WHEN 2 THEN 'Processing'
         WHEN 3 THEN 'Shipped'
         ELSE 'Unknown'
       END AS OrderStatus
FROM Orders;
  


Example 2: Create score buckets (Searched CASE)



SELECT StudentID, Score,
       CASE
         WHEN Score >= 90 THEN 'A'
         WHEN Score >= 80 THEN 'B'
         WHEN Score >= 70 THEN 'C'
         ELSE 'F'
       END AS Grade
FROM ExamResults;
  


Note how the searched CASE allows range checks and overlapping conditions — the first true WHEN wins.



Nested CASE



You can nest CASE expressions when logic requires multiple levels:



SELECT ProductID, Price,
  CASE
    WHEN Price IS NULL THEN 'No Price'
    WHEN Price < 100 THEN 'Budget'
    WHEN Price BETWEEN 100 AND 500 THEN
      CASE WHEN Discount > 0 THEN 'Discounted Mid' ELSE 'Mid' END
    ELSE 'Premium'
  END AS PriceCategory
FROM Products;
  


Nested CASE can be helpful but keep readability in mind — long nested logic is a maintenance risk.



Using CASE in UPDATE Statements



CASE is powerful in UPDATE to set values conditionally in bulk:



UPDATE Customers
SET Tier =
  CASE
    WHEN TotalSpent >= 10000 THEN 'Platinum'
    WHEN TotalSpent >= 5000  THEN 'Gold'
    WHEN TotalSpent >= 1000  THEN 'Silver'
    ELSE 'Bronze'
  END
WHERE Active = 1;
  


This updates the Tier column for all active customers in one statement — efficient and clear.



CASE with Aggregates — Conditional Aggregation



Use CASE inside aggregates to count or sum conditionally:



SELECT
  COUNT(*) AS TotalOrders,
  SUM(CASE WHEN Status = 'Shipped' THEN 1 ELSE 0 END) AS ShippedCount,
  SUM(CASE WHEN Status = 'Cancelled' THEN 1 ELSE 0 END) AS CancelledCount
FROM Orders;
  


Conditional aggregation is extremely useful for dashboard metrics and reports.



ORDER BY and CASE



CASE can define custom sort order:



SELECT Name, Priority
FROM Tasks
ORDER BY
  CASE Priority
    WHEN 'High' THEN 1
    WHEN 'Medium' THEN 2
    WHEN 'Low' THEN 3
    ELSE 4
  END;
  


This orders 'High' tasks first even if Priority is a text column.



Performance Considerations



  • CASE itself is evaluated per row — keep expressions simple for large tables.


  • Avoid calling expensive functions inside CASE repeatedly; compute once if possible.


  • Indexes won’t help CASE evaluations directly, but you can pre-filter with WHERE to reduce rows.


  • For very large transformations, consider staging results in a temporary table and indexing it.


Common Mistakes & Gotchas



  • Forgetting the END — syntax error.


  • Using overlapping WHEN conditions in simple CASE (order matters in searched CASE).


  • Expecting boolean algebra in simple CASE — simple CASE compares an expression to constants.


  • Relying on implicit data type conversions — use explicit CAST() when needed.


Practical Exercises



  1. Write a SELECT that maps order totals to categories: 'Small' < 50, 'Medium' 50–199, 'Large' >= 200.


  2. Use CASE in an UPDATE to set an account_status based on last_login date.


  3. Create a query that shows total sales per region and the percentage that comes from 'VIP' customers using conditional SUM.


Examples: Real-World Queries



Highest-priority active tasks first



SELECT TaskID, Title, Priority, IsActive
FROM Tasks
WHERE IsActive = 1
ORDER BY
  CASE Priority WHEN 'Critical' THEN 1 WHEN 'High' THEN 2 ELSE 3 END, CreatedAt DESC;
  


Conditional revenue buckets



SELECT
  ProductID,
  SUM(Amount) AS Revenue,
  CASE
    WHEN SUM(Amount) >= 100000 THEN 'Top Seller'
    WHEN SUM(Amount) >= 50000  THEN 'Strong'
    ELSE 'Standard'
  END AS PerformanceTier
FROM Sales
GROUP BY ProductID;
  


FAQ — CASE WHEN (Short Answers)



Q: Should I use simple CASE or searched CASE?



A: Use simple CASE when you compare one expression to constants. Use searched CASE for range checks or complex conditions.



Q: Can CASE return different data types?



A: Ideally, all THEN/ELSE results should be compatible types. SQL will attempt conversion, but explicit CAST() is safer.



Q: Is CASE ANSI SQL?



A: Yes — CASE is part of the SQL standard and works across major databases (MySQL, Postgres, SQL Server, Oracle), with minor dialect differences.



Conclusion



The CASE expression is a versatile and essential tool for SQL developers — it brings conditional logic into SELECTs, UPDATEs, ORDER BY, and aggregates. Keep your CASE expressions readable, prefer searched CASE for complex conditions, and avoid unnecessary nesting.



⭐ Need an SQL Certificate, CEUs, or a FREE start with Hands-On Practice! → Get Started Here!