In Oracle Database, the CASE
statement compares a list of conditions and returns one of multiple possible expressions.
Oracle Database’s CASE
statement is very similar to the CASE
expression (which is defined in the SQL standard (ISO/IEC 9075)). However, Oracle supports both the CASE
expression and the CASE
statement, and there’s a distinction between the two. The CASE
statement can be used to execute of a sequence of PL/SQL statements, whereas the CASE
expression returns a single value. Also, there’s a difference in how they deal with the lack of an ELSE
clause when a condition is not met.
Syntax
The CASE
statement can take two forms. The first form is known as the simple CASE
statement:
[ <<label>> ] CASE case_operand
WHEN boolean_expression THEN statement ;
[ WHEN boolean_expression THEN statement ; ]...
[ ELSE statement [ statement ]... ;
END CASE [ label ] ;
The other form is the searched CASE
statement:
[ <<label>> ] CASE
WHEN boolean_expression THEN statement ;
[ WHEN boolean_expression THEN statement ; ]...
[ ELSE statement [ statement ]... ;
END CASE [ label ];
The searched CASE
statement evaluates a set of Boolean expressions to determine the result. When using this form, no case_operand
is supplied.
Example – Simple CASE
Statement
Here’s an example to demonstrate the simple CASE
statement:
DECLARE
cuisine VARCHAR(20);
BEGIN
cuisine := 'Italian';
CASE cuisine
WHEN 'Thai' THEN DBMS_OUTPUT.PUT_LINE('Pad Thai');
WHEN 'Italian' THEN DBMS_OUTPUT.PUT_LINE('Pizza');
WHEN 'English' THEN DBMS_OUTPUT.PUT_LINE('Sunday Roast');
ELSE DBMS_OUTPUT.PUT_LINE('Fish and Chips');
END CASE;
END;
/
Result:
Pizza
If we change the value of the variable, we get a different result:
DECLARE
cuisine VARCHAR(20);
BEGIN
cuisine := 'Thai';
CASE cuisine
WHEN 'Thai' THEN DBMS_OUTPUT.PUT_LINE('Pad Thai');
WHEN 'Italian' THEN DBMS_OUTPUT.PUT_LINE('Pizza');
WHEN 'English' THEN DBMS_OUTPUT.PUT_LINE('Sunday Roast');
ELSE DBMS_OUTPUT.PUT_LINE('Fish and Chips');
END CASE;
END;
/
Result:
Pad Thai
When the value doesn’t match a condition, the value at ELSE
is used:
DECLARE
cuisine VARCHAR(20);
BEGIN
cuisine := 'New Zealand';
CASE cuisine
WHEN 'Thai' THEN DBMS_OUTPUT.PUT_LINE('Pad Thai');
WHEN 'Italian' THEN DBMS_OUTPUT.PUT_LINE('Pizza');
WHEN 'English' THEN DBMS_OUTPUT.PUT_LINE('Sunday Roast');
ELSE DBMS_OUTPUT.PUT_LINE('Fish and Chips');
END CASE;
END;
/
Result:
Fish and Chips
Example – Searched CASE
Statement
We could rewrite the above example to a searched CASE
statement. Doing this means we would remove the base expression, but then include it in the WHEN
part of the statement:
DECLARE
cuisine VARCHAR(20);
BEGIN
cuisine := 'Italian';
CASE
WHEN cuisine = 'Thai' THEN DBMS_OUTPUT.PUT_LINE('Pad Thai');
WHEN cuisine = 'Italian' THEN DBMS_OUTPUT.PUT_LINE('Pizza');
WHEN cuisine = 'English' THEN DBMS_OUTPUT.PUT_LINE('Sunday Roast');
ELSE DBMS_OUTPUT.PUT_LINE('Fish and Chips');
END CASE;
END;
/
Result:
Pizza
We get the same result when we pass the same value. However, there’s a difference in the processing. When we use the simple CASE
statement, cuisine
is only evaluated once. But when we use the searched CASE
statement, cuisine
is evaluated multiple times.
Omitting the ELSE
Clause
If we omit the ELSE
clause, and none of the conditions are met, the result is a CASE_NOT_FOUND
error:
DECLARE
cuisine VARCHAR(20);
BEGIN
cuisine := 'New Zealand';
CASE cuisine
WHEN 'Thai' THEN DBMS_OUTPUT.PUT_LINE('Pad Thai');
WHEN 'Italian' THEN DBMS_OUTPUT.PUT_LINE('Pizza');
WHEN 'English' THEN DBMS_OUTPUT.PUT_LINE('Sunday Roast');
END CASE;
END;
/
Result:
ORA-06592: CASE not found while executing CASE statement ORA-06512: at line 10 ORA-06512: at "SYS.DBMS_SQL", line 1721
But we don’t get the error if the case is found:
DECLARE
cuisine VARCHAR(20);
BEGIN
cuisine := 'English';
CASE cuisine
WHEN 'Thai' THEN DBMS_OUTPUT.PUT_LINE('Pad Thai');
WHEN 'Italian' THEN DBMS_OUTPUT.PUT_LINE('Pizza');
WHEN 'English' THEN DBMS_OUTPUT.PUT_LINE('Sunday Roast');
END CASE;
END;
/
Result:
Sunday Roast
Note that the CASE
expression (as opposed to the CASE
statement being discussed here) will return NULL
when there’s no ELSE
clause and no condition is met.