I'm trying to analyze an existing Oracle query written by a departed developer. I'm not well versed in Oracle and I'm a bit confused by the use of this DECODE function in a Microfocus COBOL app (where :BV-POS_YEAR is a variable set to a year):
SELECT ...., DECODE(DELV_YEAR, NULL, :BV-POS_YEAR, DELV_YEAR), ....
I'm trying to understand how that would be different from:
SELECT ...., NVL(DELV_YEAR, :BV-POS_YEAR), ....
Am I misunderstanding something about the DECODE or NVL functions? The developer is aware of the NVL function as it is used elsewhere in the very same select statement.
NVL replaces NULL by specified value.
DECODE replaces any specified value by desired value and can be chained. Your usage is equivalent, but DECODE has much wider usage. For example you can write this code
SELECT supplier_name,
DECODE(supplier_id, 10000, 'IBM',
10001, 'Microsoft',
10002, 'Hewlett Packard',
'Gateway') result
FROM suppliers;
Which is equivalent to this pseudo code
if (supplier_id == 10000)
{
SELECT 'IBM'
} else if (supplier_id == 10001)
{
SELECT 'Microsoft'
} else if (supplier_id == 10002)
{
SELECT 'Hewlet Packard'
} else
{
SELECT 'Gateway'
}
EDIT: Performance of the NVL and DECODE for the NULL replacement was measured by users and it seems to be almost equal.
I personally advice to use NVL when you need to do the NULL replacement, because it's a bit more expressive.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With