Way23
Главная
По категориям
Контакты
Главная
По категориям
Контакты

Oracle. not in и null

Если в колонке внутри подзапроса not in возможно появление null то это может привести к неверному поведению.

Рассмотрим пример, сделаем две таблицы:

create table test.table1 
  as select value v 
     from table(sys.odcinumberlist(1, 2, 3));

create table test.table2 
  as select value v 
     from table(sys.odcinumberlist(1, 3, null));

Запрос с in возвращает то что ожидается

select 
  t.value 
from 
  test.table1 t 
where 
  t.value in (select t.value from test.table2);

1 3

А вот запрос с not in не возвращает вообще ничего

select 
  t.value 
from 
  test.table1 t 
where 
  t.value not in (select t.value from test.table2);

И так будет всегда если в результате подзапроса присутствует null. Таким образом, если делается запрос с not in, всегда нужно проверить что колонка в подзапросе является not null. Или заменить условие, например на not exists.

Подробная статья про поведение null в Oracle, в том числе разобрана ситуация с not in.

Последниее изменение: 24.08.2023, 06:42