In SQLite, the CASE expression compares a list of conditions and returns one of multiple possible expressions.
The CASE expression is included in the SQL standard (ISO/IEC 9075), and most major RDBMSs support it.
Syntax
The CASE expression can take two forms. The first form is known as the simple CASE expression:
CASE value
WHEN compare_value THEN result
[WHEN compare_value THEN result ...]
[ELSE result]
END
When using this form, the value part is known as the “base” expression. The base expression is compared to a set of simple expressions to determine the result.
The other form 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. No base expression is supplied.
Example
Here’s an example to demonstrate the simple CASE expression (i.e. the one with the base expression):
SELECT
PetName,
TypeId,
CASE TypeId
WHEN 1 THEN 'Dog'
WHEN 2 THEN 'Cat'
WHEN 3 THEN 'Buffalo'
ELSE 'Other'
END AS Type
FROM Pets;
Result:
PetName TypeId Type ------- ------ ------- Homer 3 Buffalo Yelp 1 Dog Fluff 2 Cat Brush 4 Other
We could rewrite this to a searched CASE expression. Doing this means we would remove the base expression, but then include it in the WHEN part of the statement:
SELECT
PetName,
TypeId,
CASE
WHEN TypeId = 1 THEN 'Dog'
WHEN TypeId = 2 THEN 'Cat'
WHEN TypeId = 3 THEN 'Buffalo'
ELSE 'Other'
END AS Type
FROM Pets;
Result:
PetName TypeId Type ------- ------ ------- Homer 3 Buffalo Yelp 1 Dog Fluff 2 Cat Brush 4 Other
We get the same result. However, there’s a difference in the processing. When we use the simple CASE expression, TypeId is only evaluated once. But when we use the searched CASE expression, TypeId is evaluated multiple times.
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 first set our .nullvalue to a value other than the default empty space:
.nullvalue <null>
That ensures that any NULL values will appear as <null>.
Now let’s run the first example again, but this time we’ll omit the ELSE clause:
SELECT
PetName,
TypeId,
CASE TypeId
WHEN 1 THEN 'Dog'
WHEN 2 THEN 'Cat'
WHEN 3 THEN 'Buffalo'
END AS Type
FROM Pets;
Result:
PetName TypeId Type ------- ------ ------- Homer 3 Buffalo Yelp 1 Dog Fluff 2 Cat Brush 4 <null>
This time, instead of getting Other in the last row, we got <null>, which indicates that it’s a NULL value.
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. We can also use it in an INSERT statement, and even in an ORDER BY clause. See SQL CASE Statement for examples.
The IIF() Function – A Shortcut
SQLite also has the IIF() function that can be used as a shortcut for certain CASE expressions.
Therefore, the following:
CASE WHEN x THEN y ELSE z END
Can also be written as this:
IIF(x, y, z)