Примітка: Оскільки хтось стверджував, що зовнішнє посилання мертве у відповіді Сушанта Бутти, я розмістив вміст тут як окрему відповідь.
Остерігайтеся НУЛЬ .
Сьогодні я натрапив на дуже дивну поведінку запитів під час використання IN та NOT INоператорів. Насправді я хотів порівняти дві таблиці та з'ясувати, чи table bіснувало значення в table aчи ні, і з'ясувати його поведінку, якщо стовпець містить nullзначення. Тож я просто створив середовище для перевірки такої поведінки.
Створимо таблицю table_a.
SQL> create table table_a ( a number);
Table created.
Створимо таблицю table_b.
SQL> create table table_b ( b number);
Table created.
Вставте деякі значення в table_a.
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
Вставте деякі значення в table_b.
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
Тепер ми виконаємо запит, щоб перевірити існування значення в table_a, перевіривши його значення за table_bдопомогою INоператора.
SQL> select * from table_a where a in (select * from table_b);
A
3
Виконайте нижченаведений запит, щоб перевірити відсутність.
SQL> select * from table_a where a not in (select * from table_b);
A
1
2
Результат прийшов, як очікувалося. Тепер ми вставимо nullзначення в таблицю table_bі побачимо, як поводяться вищезазначені два запити.
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
Перший запит поводився належним чином, але що сталося з другим запитом? Чому ми не отримали жодного результату, що мало статися? Чи є різниця у запиті? Ні .
Зміна в даних табл table_b. Ми ввели nullзначення в таблицю. Але як це так поводиться? Розділимо два запити на оператор "AND"та "OR".
Перший запит:
Перший запит буде оброблятися внутрішньо приблизно так. Отже, a тут nullне створить проблеми, оскільки мої перші два операнди будуть оцінювати trueабо false. Але мій третій операнд a = nullне буде ні оцінювати, trueні false. Він оцінить nullлише.
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
Другий запит:
Другий запит буде оброблений, як показано нижче. Оскільки ми використовуємо "AND"оператор і будь-що інше, ніж trueбудь-який з операндів, це не дасть мені результату.
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
То як ми з цим справляємося? Ми виберемо всі not nullзначення з таблиці table_bпід час використання NOT INоператора.
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
1
2
Тому завжди будьте обережні щодо NULLзначень у стовпці під час використання NOT INоператора.
Остерігайтеся НУЛЯ !!
inбуде проаналізовано ідентичноfield=val1 or field=val2 or field=val3. Введення туди нуля зведеться до того,field=nullщо не буде працювати.