Whats the Problem in "not in" ??

See the Table Desc and values then the query what is the problem in final query
SQL> desc date_test
Name Null? Type
SNO VARCHAR2(1)
ADD_DT DATE
DEL_DT DATE
SQL> desc date_test1
Name Null? Type
SNO VARCHAR2(1)
ADD_DT DATE
DEL_DT DATE
SQL> SELECT TO_CHAR(ADD_DT,'DD-MON-YYY') FROM DATE_TEST1;
TO_CHAR(AD
09-APR-008
09-APR-008
10-APR-008
11-APR-008
SQL> SELECT TO_CHAR(ADD_DT,'DD-MON-YYY') FROM DATE_TEST;
TO_CHAR(AD
09-APR-008
09-APR-008
09-APR-008
09-APR-008
09-APR-008
09-APR-008
09-APR-008
10-APR-008
11 rows selected.
SQL> SELECT ADD_DT FROM DATE_TEST WHERE TO_CHAR(ADD_DT,'DD-MON-YYY')IN (SELECT TO_CHAR(ADD_DT,'DD-MON-YYY') FROM DATE_TEST1);
ADD_DT
09-APR-08
09-APR-08
09-APR-08
09-APR-08
09-APR-08
09-APR-08
09-APR-08
10-APR-08
8 rows selected.
SQL> SELECT ADD_DT FROM DATE_TEST WHERE TO_CHAR(ADD_DT,'DD-MON-YYY') NOT IN (SELECT TO_CHAR(ADD_DT,'DD-MON-YYY') FROM DATE_TEST1);
no rows selected
Many thanks
kalinga

NOT IN does not work correctly if any of the values are null.
Null means unknown - if we don't know what it is, how can we know whether or not it matches? Oracle's response to this is to not return any rows.
Either NVL the value in the NOT IN or explicitly select where add_dt is not null.
Further explanation:
Imagine we're spelling out the NOT IN explicitly. Then it becomes
(field != row1value AND field != row2value AND...field != rowNvalue)
If row1value is NULL then this is a direct comparison involving NULL so it returns false. Because it is AND, that means the whole condition returns false. So you get no matching rows.
Message was edited by:
Dave Hemming

Similar Messages

Maybe you are looking for