7.3 Using NULLs in Compound Queries
We discussed union
compatibility conditions at the
beginning of this chapter. The union compatibility issue gets
interesting when NULLs are involved. As we know, NULL
doesn't have a datatype, and NULL can be used in
place of a value of any datatype. If we purposely select NULL as a
column value in a component query, Oracle no longer has two datatypes
to compare in order to see whether the two component queries are
compatible. For character columns, this is no problem. For example:
SELECT 1 NUM, 'DEFINITE' STRING FROM DUAL
UNION
SELECT 2 NUM, NULL STRING FROM DUAL;
NUM STRING
---------- --------
1 DEFINITE
2
Notice that Oracle considers the character string 'DEFINITE' from the
first component query to be compatible with the NULL value supplied
for the corresponding column in the second component qery. However,
if a NUMBER or a DATE column of a component query is set to NULL, we
must explicitly tell Oracle what
"flavor" of NULL to use. Otherwise,
we'll encounter
errors. For
example:
SELECT 1 NUM, 'DEFINITE' STRING FROM DUAL
UNION
SELECT NULL NUM, 'UNKNOWN' STRING FROM DUAL;
SELECT 1 NUM, 'DEFINITE' STRING FROM DUAL
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
Note that the use of NULL in the second component query causes a
datatype mismatch between the first column of the first component
query, and the first column of the second component query. Using NULL
for a
DATE column causes the same problem,
as in the following example:
SELECT 1 NUM, SYSDATE DATES FROM DUAL
UNION
SELECT 2 NUM, NULL DATES FROM DUAL;
SELECT 1 NUM, SYSDATE DATES FROM DUAL
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
In these cases, we need to cast the NULL to a suitable datatype to
fix the problem, as in the following examples:
SELECT 1 NUM, 'DEFINITE' STRING FROM DUAL
UNION
SELECT TO_NUMBER(NULL) NUM, 'UNKNOWN' STRING FROM DUAL;
NUM STRING
---------- --------
1 DEFINITE
UNKNOWN
SELECT 1 NUM, SYSDATE DATES FROM DUAL
UNION
SELECT 2 NUM, TO_DATE(NULL) DATES FROM DUAL;
NUM DATES
---------- ---------
1 06-JAN-02
2
This problem of union compatibility when using NULLs is encountered
in Oracle8i. However, there is no such problem
in Oracle9i, as we can see in the following
examples generated from an Oracle9i database:
SELECT 1 NUM, 'DEFINITE' STRING FROM DUAL
UNION
SELECT NULL NUM, 'UNKNOWN' STRING FROM DUAL;
NUM STRING
---------- --------
1 DEFINITE
UNKNOWN
SELECT 1 NUM, SYSDATE DATES FROM DUAL
UNION
SELECT 2 NUM, NULL DATES FROM DUAL;
NUM DATES
---------- ---------
1 06-JAN-02
2
Oracle9i is smart enough to know which flavor of
NULL to use in a compound query.
|