The following code shows what happens when set includes a NULL value.
SQL> SQL> CREATE OR REPLACE PROCEDURE print_boolean ( 2 b_name VARCHAR2,-- from w ww .ja v a 2 s .co m 3 b_value BOOLEAN 4 ) IS 5 BEGIN 6 IF b_value IS NULL THEN 7 DBMS_OUTPUT.PUT_LINE (b_name || ' = NULL'); 8 ELSIF b_value = TRUE THEN 9 DBMS_OUTPUT.PUT_LINE (b_name || ' = TRUE'); 10 ELSE 11 DBMS_OUTPUT.PUT_LINE (b_name || ' = FALSE'); 12 END IF; 13 END; 14 / Procedure created. SQL> DECLARE 2 a INTEGER; -- Initialized to NULL by default 3 b INTEGER := 10; 4 c INTEGER := 100; 5 BEGIN 6 print_boolean ('100 IN (NULL, b, c)', 100 IN (a, b, c)); 7 print_boolean ('100 NOT IN (NULL, b, c)', 100 NOT IN (a, b, c)); 8 9 print_boolean ('100 IN (NULL, b)', 100 IN (a, b)); 10 print_boolean ('100 NOT IN (NULL, b)', 100 NOT IN (a, b)); 11 12 print_boolean ('NULL IN (a, b)', a IN (a, b)); 13 print_boolean ('NULL NOT IN (NULL, b)', a NOT IN (a, b)); 14 END; 15 / 100 IN (NULL, b, c) = TRUE 100 NOT IN (NULL, b, c) = FALSE 100 IN (NULL, b) = NULL 100 NOT IN (NULL, b) = NULL NULL IN (a, b) = NULL NULL NOT IN (NULL, b) = NULL PL/SQL procedure successfully completed. SQL>