The Oracle functions CASE, DECODE, and COALESCE all perform similar functionality. They can transform a value into another value. Which one should you use? I'll explain the pros and cons of each in this article.
The COALESCE Function
The Oracle COALESCE function allows you to return the first non-NULL value from a list of parameters
The syntax is:
COALESCE ( expr1, expr2, [expr...] )
Many expressions (expr1, expr2) can be used. The expr1 is checked if it is NULL. If it is, then expr2 is returned. If it is not, then expr1 is returned.
It's a simple function, and it's helpful as it can take a lot of parameters, and it's easier to write.
It's better than using an NVL function as it takes more parameters, which may be more useful for your code.
The downside is that it only transforms NULL values. It can't change other values, such as 0, or advanced logic compared to CASE and DECODE.
The DECODE Function
The DECODE function in Oracle allows you to have IF-THEN-ELSE logic in your SQL statements.
The syntax is:
DECODE ( expression, search, result [, search, result]... [,default] )
The expression is the value to compare. Many combinations of search and result can be supplied. Search is compared against the expression, and if it is true, then result is returned.
The DECODE function is an older function, but still quite powerful. It can handle advanced logic, but can get hard to read as the function gets longer.
The CASE Statement
The CASE statement in Oracle isn't a function, so I haven't labelled it as one.
CASE allows you to perform IF-THEN-ELSE logic in your SQL statements, similar to DECODE.
The syntax is:
CASE [expression] WHEN condition_1 THEN result_1 WHEN condition_2 THEN result_2... WHEN condition_n THEN result_n ELSE result END case_name
The expression is used to compare against. Many conditions and results can be specified, and if a condition matches the expression, then the result is returned. The ELSE keyword specifies what happens if no condition is met.
It was introduced into Oracle to replace the DECODE function.
Why have both then?
Well, there are several reasons.
CASE offers more flexibility than the DECODE function. Tasks that are hard to implement with DECODE are easy to implement using CASE, which makes it easier to write your SQL.
It's also easier to read. More keywords within the statement allow you to break up the logic, rather than using a series of parameters in a single function.
They also handle NULL values differently. With DECODE, NULL is equal to NULL. With CASE, NULL is not equal to NULL.
CASE, DECODE, or COALESCE
So, which one should you use?
I would suggest using CASE in almost every case. CASE is better than DECODE because it is easier to read, and can handle more complicated logic.
As far as performance goes, there is minimal difference between CASE and DECODE, so it should not be a factor in your decisions.
For simply transforming a series of NULL values, I would suggest using COALESCE. You could use COALESCE to perform advanced logic, but I would suggest using the function for its intended use, and using CASE for your advanced logic.
I hope this article has given you more clarity on these three functions and which one to use.