In Oracle Database, the CASE expression compares a list of conditions and returns one of multiple possible expressions. It allows us to use IF … THEN … ELSE logic in SQL statements without having to invoke procedures.
The CASE expression is included in the SQL standard (ISO/IEC 9075), and most major RDBMSs support it.
Oracle also has a CASE statement that’s very similar to the CASE expression, but with some minor differences.
Syntax
The syntax goes like this:
CASE { simple_case_expression
| searched_case_expression
}
[ else_clause ]
END
That indicates that the CASE expression can take two forms; the simple CASE expression, and the the searched CASE expression.
Here’s the syntax for simple_case_expression:
expr
{ WHEN comparison_expr THEN return_expr }...
When using this form, the expr part is compared to a set of simple expressions to determine the result.
And here’s the syntax for searched_case_expression:
{ WHEN condition THEN return_expr }...
The searched CASE expression evaluates a set of expressions to determine the result. No base expression is supplied.
The optional ELSE clause goes like this:
ELSE else_expr
The ELSE clause determines what’s returned if none of the conditions are met.
Example
Here’s an example to demonstrate the simple CASE expression:
SELECT
OE#,
Model,
CASE Model
WHEN 'HILUX' THEN 'Toyota'
WHEN 'COMMODORE' THEN 'Holden'
WHEN 'X-TRAIL' THEN 'Nissan'
ELSE 'Unknown'
END AS Manufacturer
FROM Autoparts
ORDER BY Manufacturer;
Result:
| OE# | MODEL | MANUFACTURER |
|---|---|---|
| 62150C3278 | COMMODORE | Holden |
| 86000-7900 | X-TRAIL | Nissan |
| 62150A3278 | HILUX | Toyota |
| 86001-7800 | HILUX | Toyota |
| 62150B3278 | CAMRY | Unknown |
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
OE#,
Model,
CASE
WHEN Model = 'HILUX' THEN 'Toyota'
WHEN Model = 'COMMODORE' THEN 'Holden'
WHEN Model = 'X-TRAIL' THEN 'Nissan'
ELSE 'Unknown'
END AS Manufacturer
FROM Autoparts
ORDER BY Manufacturer;
Result:
| OE# | MODEL | MANUFACTURER |
|---|---|---|
| 62150C3278 | COMMODORE | Holden |
| 86000-7900 | X-TRAIL | Nissan |
| 62150A3278 | HILUX | Toyota |
| 86001-7800 | HILUX | Toyota |
| 62150B3278 | CAMRY | Unknown |
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:
SELECT
OE#,
Model,
CASE Model
WHEN 'HILUX' THEN 'Toyota'
WHEN 'COMMODORE' THEN 'Holden'
WHEN 'X-TRAIL' THEN 'Nissan'
END AS Manufacturer
FROM Autoparts
ORDER BY Manufacturer;
Result:
| OE# | MODEL | MANUFACTURER |
|---|---|---|
| 62150C3278 | COMMODORE | Holden |
| 86000-7900 | X-TRAIL | Nissan |
| 62150A3278 | HILUX | Toyota |
| 86001-7800 | HILUX | Toyota |
| 62150B3278 | CAMRY | – |
This time, instead of getting Unknown in the last row, we got -, which indicates that it’s a NULL value.
Using the CASE Expression in Other Contexts
The CASE expression 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 expression 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.