2013-11-26 1 views
2

КЛИЕНТОВ ТАБЛИЦЫNOT IN возвращает ложь, если значение в списке является нулевой

CUSTOMER_ID FIRST_NAME  LAST_NAME   DOB  PHONE 

1   John   Brown   1/1/1965 800-555-1211 
2   Cynthia   Orange  2/5/1968 800-555-1212 
3   Steve   White   3/16/1971 800-555-1213 
4   Gail   Black     800-555-1214 
5   Doreen   Blue   5/20/1970 
6   Fred   Brown   1/1/1970 800-555-1215 

Если запустить запрос

select * from customers where customer_id not in (2,3,5,NULL); 

я получаю выход строки не возвращенную ..... Пожалуйста, помогите мне решить этот вопрос из ..

+0

Пожалуйста EXPLAIN ?????? что это значит ??? –

+0

Я хочу сказать, почему вывод не возвращает строк. – Nikhil

+0

Это не способ задать вопрос приятелю .... –

ответ

4

Вы укусили 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); 
0

попробовать этот

select * from customers where customer_id not in (2,3,5); 
2

В данном конкретном случае, вы ищете

select * from customers where customer_id not in (2,3,5); 

Нулевая будет опущено в этом случае.

Почему?

Как пояснил here, а не у даного делает, в этом случае следующее:

select * where CustomerID <> 2 and CustomerID <> 3 and CustomerID <> 5 and CustomerID <> NULL 

Использование по умолчанию ANSI_NULLS обозначения на, CUSTOMERID <> NULL приведет в UNKNOWN. Когда SQL имеет UNKNOWN, он не будет возвращать строки. Когда это выключено, оно вернет true.

У вас есть два варианта на данный момент:

  1. Измените заявление, чтобы не иметь нуль в нем
  2. Измени Database Engine, чтобы иметь ANSI_NULLS от

Я думаю, что 1 будет гораздо более простой выбор в этом случае ...

+0

Но я получил выход, когда я выполнил этот запрос, выберите * от клиентов, где customer_id в (2,3,5, NULL) – Nikhil

0

Ваше заявление

select * from customers where customer_id in (2,3,5,NULL) 

равно

select * where CustomerID = 2 or CustomerID = 3 or CustomerID = 5 or CustomerID = NULL 

Последнее выражение "CustomerID = NULL" возвращает всегда FALSE, но из-OR это влияет на результат.

Вы должны написать это:

select * from customers where customer_id in (2,3,5) or customer_id IS NULL 
+0

'CustomerId = NULL' всегда возвращает null/unknown, NOT false. – dan04

Смежные вопросы