In PostgreSQL, the CASE expression compares a list of conditions and returns one of multiple possible result expressions.
The CASE expression is included in the SQL standard (ISO/IEC 9075), and most major RDBMSs support it.
Syntax
The basic syntax for the CASE expression goes like this:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
Actually, there are two forms of CASE expression. One form is the simple CASE expression:
CASE value
WHEN compare_value THEN result
[WHEN compare_value THEN result ...]
[ELSE result]
END
The simple CASE expression compares an expression to a set of simple expressions to determine the result.
The other option is the searched CASE expression:
CASE
WHEN condition THEN result
[WHEN condition THEN result ...]
[ELSE result]
END
The searched CASE expression evaluates a set of Boolean expressions to determine the result.
Example
Here’s an example to demonstrate the simple CASE expression:
SELECT
genreid,
CASE genreid
WHEN 1 THEN 'Rock'
WHEN 2 THEN 'Jazz'
WHEN 3 THEN 'Country'
WHEN 4 THEN 'Pop'
WHEN 5 THEN 'Blues'
ELSE 'Other'
END AS genre
FROM public.genres;
Result:
genreid | genre
---------+---------
1 | Rock
2 | Jazz
3 | Country
4 | Pop
5 | Blues
6 | Other
7 | Other
8 | Other
We could rewrite this to a searched CASE expression if we wanted. We could do that like this:
SELECT
genreid,
CASE
WHEN genreid = 1 THEN 'Rock'
WHEN genreid = 2 THEN 'Jazz'
WHEN genreid = 3 THEN 'Country'
WHEN genreid = 4 THEN 'Pop'
WHEN genreid = 5 THEN 'Blues'
ELSE 'Other'
END AS genre
FROM public.genres;
Result:
genreid | genre
---------+---------
1 | Rock
2 | Jazz
3 | Country
4 | Pop
5 | Blues
6 | Other
7 | Other
8 | Other
Same result.
The Optional ELSE Clause
The above examples use the ELSE clause to determine what happens if none of the conditions are met, however, the ELSE clause is optional.
If we omit the ELSE clause, and none of the conditions are met, the result is NULL.
Let’s omit the ELSE clause from the first example:
SELECT
genreid,
CASE genreid
WHEN 1 THEN 'Rock'
WHEN 2 THEN 'Jazz'
WHEN 3 THEN 'Country'
WHEN 4 THEN 'Pop'
WHEN 5 THEN 'Blues'
END AS genre
FROM public.genres;
Result:
genreid | genre
---------+---------
1 | Rock
2 | Jazz
3 | Country
4 | Pop
5 | Blues
6 | <null>
7 | <null>
8 | <null>
In my case, NULL values are represented by the string <null>. That’s because I set up psql to return that string for NULL values.
Using the CASE Operator in Other Contexts
The CASE operator isn’t limited to just SELECT statements. We can use it pretty much anywhere a valid expression can be used.
For example, we can use the CASE operator as part of an UPDATE statement when updating data in a database. See SQL CASE Statement for examples.