This article will provide you a summary of the NULL functions available for handling null values in Oracle.
All examples are described with the use of following table.
CREATE TABLE TEST_NULL_VALUE ( test_id NUMBER(4), value1 VARCHAR2(12), value2 VARCHAR2(12), value3 VARCHAR2(12), value4 VARCHAR2(12), value5 VARCHAR2(12) ); INSERT INTO TEST_NULL_VALUE values (100, 'FIRST','SECOND','THIRD','FORTH','FIFTH'); INSERT INTO TEST_NULL_VALUE values (101, NULL,'SECOND','THIRD',’FORTH','FIFTH'); INSERT INTO TEST_NULL_VALUE values (102, NULL,NULL, 'THIRD', 'FORTH','FIFTH'); INSERT INTO TEST_NULL_VALUE values (103, NULL, NULL, 'THIRD', 'FORTH','FIFTH'); INSERT INTO TEST_NULL_VALUE values (104, NULL, NULL, NULL, 'FORTH','FIFTH'); COMMIT;
When we select TEST_NULL_VALUE table data we get the following result. Now we will use NULL functions to check the result of those functions.
SELECT * FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID VALUE1 VALUE2 VALUE3 VALUE4 VALUE5 ---------- ------------ ------------ ------------ ------------ ------------ 100 FIRST SECOND THIRD FORTH FIFTH 101 SECOND THIRD FORTH FIFTH 102 THIRD FORTH FIFTH 103 THIRD FORTH FIFTH 104 FORTH FIFTH 5 rows selected. SQL>
NVL Function:
The NVL function permits you to replace all null values with a default value. It requires two parameter values first value is column name and second is any default value.
If the value in the first parameter is null then the function returns the value in the second parameter. If the first parameter is any value other than null, it returns unchanged value.
Here we are using the NVL function to replace the null values with ‘ZERO’.
SELECT TEST_ID, NVL(value1, 'ZERO') AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 FIRST 101 ZERO 102 ZERO 103 ZERO 104 ZERO 5 rows selected. SQL>
Now you can see the above example where null value has been replaced with ZERO.
DECODE Function:
The DECODE function is not specifically designed for handling null values but it can be used to replace NULL values just like NVL function.
SELECT TEST_ID, DECODE(value1, NULL, 'ZERO', value1) AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 FIRST 101 ZERO 102 ZERO 103 ZERO 104 ZERO 5 rows selected. SQL>
NVL2 Function:
The NVL2 function is entirely different from NVL function because it accepts three parameters.
If the first column value is not null then it returns the value of the second column. If the first column value is null then it returns the value of third column.
SELECT TEST_ID, NVL2(value1, value2, value3) AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 SECOND 101 THIRD 102 THIRD 103 THIRD 104 5 rows selected. SQL> SELECT TEST_ID, NVL2(value2, value3, value4) AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 THIRD 101 THIRD 102 FORTH 103 FORTH 104 FORTH 5 rows selected. SQL>
In both the above examples columns are changed and you can see the results.
COALESCE Function:
The COALESCE function accepts two or more parameters and returns the first non null value in a list. If all parameters contain null values then it returns null.
SELECT TEST_ID, COALESCE(value1, value2, value3) AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 FIRST 101 SECOND 102 THIRD 103 THIRD 104 5 rows selected. SQL> SELECT TEST_ID, COALESCE(value2, value3, value4) AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 SECOND 101 SECOND 102 THIRD 103 THIRD 104 FORTH 5 rows selected. SQL> SELECT TEST_ID, COALESCE(value1, value2, value3, value4) AS RESULT FROM TEST_NULL_VALUE ORDER BY TEST_ID; TEST_ID RESULT ---------- ------------ 100 FIRST 101 SECOND 102 THIRD 103 THIRD 104 FORTH 5 rows selected. SQL>
NOTE:
When you compare against null always, you always get result in null because NULL can’t be used with regular comparison operators like “=” or “!=”.
SELECT * FROM TEST_NULL_VALUE WHERE VALUE1 = NULL ORDER BY TEST_ID; no rows selected SQL>
Instead of you must use IS NULL or IS NOT NULL operators.
SELECT * FROM TEST_NULL_VALUE WHERE VALUE1 IS NULL ORDER BY TEST_ID; TEST_ID VALUE1 VALUE2 VALUE3 VALUE4 VALUE5 ---------- ------------ ------------ ------------ ------------ ------------ 101 SECOND THIRD FORTH FIFTH 102 THIRD FORTH FIFTH 103 THIRD FORTH FIFTH 104 FORTH FIFTH 4 rows selected. SQL>