Дилемма NOT IN со значениями NULL в ORACLE SQL - PullRequest
0 голосов
/ 21 марта 2020

Когда я использовал этот код

WHEN col1 NOT IN (SELECT col2 FROM table_name) THEN 'something'

, он не дал ожидаемых результатов, зная, что col2 содержит значение NULL. Почему это произошло? Использование IN со значениями NULL портит данные, хранящиеся в памяти, или что?

1 Ответ

2 голосов
/ 21 марта 2020

Это не проблема с 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.

...