Примітка: Оскільки хтось стверджував, що зовнішнє посилання мертве у відповіді Сушанта Бутти, я розмістив вміст тут як окрему відповідь.
Остерігайтеся НУЛЬ .
Сьогодні я натрапив на дуже дивну поведінку запитів під час використання 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
що не буде працювати.