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));
1
2
3
4
5
6
7
2
3
4
5
6
7
Запрос с in
возвращает то что ожидается
select
t.value
from
test.table1 t
where
t.value in (select t.value from test.table2);
1
2
3
4
5
6
2
3
4
5
6
1 3
А вот запрос с not in
не возвращает вообще ничего
select
t.value
from
test.table1 t
where
t.value not in (select t.value from test.table2);
1
2
3
4
5
6
2
3
4
5
6
И так будет всегда если в результате подзапроса присутствует null
. Таким образом, если делается запрос с not in
, всегда нужно проверить что колонка в подзапросе является not null
. Или заменить условие, например на not existsopen in new window.
Подробная статьяopen in new window про поведение null
в Oracle, в том числе разобрана ситуация с not in
.