Это не проблема с Oracle. Вот как определяется SQL.
Когда подзапрос возвращает значение NULL
с NOT IN
, тогда строки не совпадают вообще. По этой причине я настоятельно рекомендую всегда , используя NOT EXISTS
вместо:
WHEN NOT EXISTS (SELECT 1 FROM bst WHERE x.n = bst.p)
THEN 'Leaf'
В качестве следствия я обычно использую EXISTS
вместо IN
, хотя это не так. есть эта проблема.
Почему это происходит? NULL
означает, что значение неизвестно , а не то, что значение «отсутствует» или что-то еще.
Итак, если все элементы имеют значения, это легко вычислить:
1 NOT IN (1, 2) --> false
3 NOT IN (1, 2) --> true
Однако:
1 NOT IN (1, 2, NULL) --> false
3 NOT IN (1, 2, NULL) --> NULL, because NULL could be equal to "3"
В основном, если любое значение равно NULL
, то NOT IN
возвращает либо «ложь», либо NULL
. И «ложь», и NULL
обрабатываются одинаково в WHEN
и WHERE
.