✉️ prince.ecuacion@princetheba.com

SQL CASE Statements – Add Conditional Logic

SQL CASE Statements – Add Conditional Logic

What are SQL CASE Statements and Why are They Useful?

SQL CASE statements allow you to add if-then logic to queries without having to write complex procedural code. They make it easy to perform conditional aggregation, transform data on the fly, filter record sets, and much more. CASE statements are a concise way to implement decision logic within standard SQL statements.

Using CASE conditional logic directly inside SQL eliminates lots of complex application code you might otherwise have to write. Any app that interacts with a database can benefit. CASE greatly simplifies reporting tasks too.

Overall, mastering CASE statements will let you query data in more flexible ways and reduce reliance on slow application-level processing.

Basic Syntax and Simple Examples of CASE Statements

The syntax for CASE statements in SQL is pretty straightforward:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2 
    ...
    ELSE result
END

The WHEN/THEN clauses allow you to specify conditions, with each separate WHEN checking for a different predicate. The ELSE at the end handles anything that doesn’t meet the other criteria.

Here is a simple example that classifies numbers as small, medium, or large:

SELECT
    num,
    CASE 
        WHEN num < 10 THEN 'Small'
        WHEN num < 100 THEN 'Medium'
        ELSE 'Large'
    END AS size
FROM numbers;

We can use the COALESCE function along with CASE to handle null values by providing a default:

SELECT
    name,
    COALESCE(
        CASE
            WHEN grade >= 90 THEN 'A'
            WHEN grade >= 80 THEN 'B'
            ELSE 'C'  
        END,
        'N/A'  
    ) AS letter_grade
FROM students;

As you can see, CASE statements make it easy to conditionally alter results within a standard query.

Using CASE Statements in WHERE Clauses to Filter Records

CASE can be extremely valuable for filtering records with complex conditions in WHERE clauses.

For example, let’s filter product listings differently depending on product type:

SELECT *
FROM listings
WHERE
    CASE product_type 
        WHEN 'electronics' THEN price < 100
        WHEN 'clothing' THEN price < 50
        ELSE price < 10
    END

We were able to define custom price filters for different product categories, rather than just using one blanket condition.

You can also filter differently based on date ranges:

SELECT *
FROM web_logs
WHERE
   CASE
     WHEN created_at >= CURRENT_DATE - INTERVAL '7 days' THEN views > 100
     WHEN created_at >= CURRENT_DATE - INTERVAL '30 days' THEN views > 500  
     ELSE views > 1000
   END

The key thing to remember is that CASE in WHERE always results in either TRUEFALSE, or NULL. So make sure your logic simplifies down to that.

CASE Expressions for Transforming Data in SELECT Statements

In addition to the filtering examples we just covered, CASE can transform data during selection:

SELECT
    name,
    CASE status 
        WHEN 1 THEN 'Active'
        WHEN 2 THEN 'Inactive'
        ELSE 'Unknown'
    END AS status
FROM accounts;

We were able to turn magic status numbers into readable strings!

You can shape or concatenate data in other creative ways too:

SELECT
    name,
    CASE
        WHEN LENGTH(title) > 30 THEN CONCAT(SUBSTRING(title, 1, 30), '...')
        ELSE title
    END AS short_title
FROM books;

In this case, we truncated any book titles longer than 30 characters by tacking on ellipses.

These examples demonstrate the flexibility of CASE for handling values during result processing.

Handling Nulls, ELSE, and Other Advanced Features

A common requirement is substituting values when columns contain nulls. As shown earlier, combining CASE and COALESCE provides an easy way to tackle this:

SELECT 
    name,
    COALESCE(middle_name, CASE WHEN middle_name IS NULL THEN '(none)' END)
FROM customers;

The ELSE clause in CASE defaults to null, but it’s sometimes useful to specify a different value:

SELECT
  name,
  CASE
    WHEN grade >= 90 THEN 'A'
    WHEN grade >= 80 THEN 'B' 
    ELSE 'No pass'
  END AS letter_grade 
FROM students;

And while each CASE statement can only include one ELSE, you can chain various CASE expressions together in nested fashion for more advanced logic.

CASE Statement Performance Considerations

CASE statements are very versatile, however overusing them can negatively impact query optimization in some database systems.

Keep conditional logic simple whenever possible, and test regularly to catch performance issues before they affect end users. If queries do slow down, try to isolate whether CASE is the actual culprit.

In most situations CASE performs well, but it’s always good to be aware of the tradeoffs and test builds thoroughly!

FAQ

What is the difference between CASE statements and IF…THEN logic?

CASE statements allow conditional logic directly in SQL without having to implement procedural code like IF…THEN programming blocks. So CASE keeps things concise and set-based.

Can CASE statements be used with aggregate functions?

Absolutely! CASE works well to define conditions over groups of records before aggregation.

What other SQL dialects support CASE statements?

Nearly every SQL variant supports CASE expressions, including T-SQL for Microsoft SQL Server, PL/pgSQL in PostgreSQL, and beyond.

Conclusion

SQL CASE statements enable you to selectively display data and shape result sets on the fly based on custom conditions. They provide a simple way add if-then logic without having to rely on slow procedural code or external application processing.

As you add advanced querying features like window functions, stored procedures, etc, don’t forget the trusty CASE statement. Mastering various forms of conditional logic will make your SQL capabilities far more flexible!

Prince the B.A. Avatar

Leave a Reply

Your email address will not be published. Required fields are marked *