Вы укусили SQL-3-значную логику.
Для строк с customer_id
из 2, 3 или 5 предложение WHERE
оценивает значение false, как и ожидалось.
Для других строк, она вычисляет UNKNOWN
(или NULL
, я не знаю, если Oracle отличает их), не к действительности.
Это может быть более ясно, если выражение IN
было расширено до (customer_id != 2) AND (customer_id != 3) AND (customer_id != 5) AND (customer_id != NULL)
. Для customer_id
из 1, 4 или 6 первых трех подвыражений, оцененных как true, как и ожидалось. Но последнее оценивается как неизвестное, потому что NULL
(маркер неизвестного значения) может «действительно» быть 1, 4 или 6. Таким образом, все выражение имеет неизвестное значение истины. Оператор SELECT
будет возвращать только строки, для которых предложение WHERE
определенно верно, а не неизвестно.
Вы можете получить желаемые результаты, выполнив запрос.
select * from customers where customer_id not in (2, 3, 5) and customer_id is not null;
Тем не менее, кажется, что ваш customer_id
является столбцом автоинкремент и не может на самом деле быть пустым в любом случае.Если это так, просто написать:
select * from customers where customer_id not in (2, 3, 5);
Пожалуйста EXPLAIN ?????? что это значит ??? –
Я хочу сказать, почему вывод не возвращает строк. – Nikhil
Это не способ задать вопрос приятелю .... –