2013-07-09 2 views
2

В пункте NOT IN отсутствует значение NULL при проверке состояния.Значение NOT IN и значение NULL

INPUT 
ID NAME 
1 A 
2 <null> 
3 C 

SELECT... FROM... 
WHERE NAME NOT IN ('C') 

возвращает только значение идентификатора 1. Мне нужно как 1 & 2.

Может ли это сделать?

+3

просто добавить 'ИЛИ имя null' него конец линии –

+0

http://stackoverflow.com/questions/12966873/mysql-why-is-null-ignored-in-mysql – asifsid88

+0

В основном вы хотите показать данные таблицы, кроме тех случаев, когда имя C ... ?? – Vishal

ответ

0
SELECT... 
FROM... 
WHERE NAME NOT IN ('C') 
    OR NAME IS NULL 

SELECT... 
FROM... 
WHERE ISNULL(NAME, '') NOT IN ('C') 
+1

'ISNULL (NAME, '') NOT IN ('C')' никогда не будет оптимизирован. Никогда не следует рассматривать как решение. – zerkms

+0

согласен - использование любой функции в столбце делает недействительным индекс; поэтому я сжимаю, когда вижу код типа «WHERE lower (username) =: param», тогда меня спрашивают, почему этот запрос настолько медленный », есть индекс для имени пользователя!» – Trent

+0

@zerkms - хотя 'NAME NOT IN ('C') ИЛИ NAME NULL', вероятно, приведет к полному сканированию таблицы, по крайней мере, на Oracle. – APC

2

Правильное SQL-бы

SELECT... FROM... 
WHERE NAME NOT IN ('C') 
or NAME is NULL 

Это потому, что любые сравнения с NULLNULL также дают (т.е. не truthy, ни falsy). (Кредит @Jack)

См:
MySQL: Why is NULL ignored in MySQL?
Working of Null Values

+0

Я это заметил! ;-) – zerkms

+0

@zerkms lolz: D – asifsid88

+0

@ asifsid88 - Причина верна, но ваше состояние неверно. Это должно быть 'Name IS NULL' IMO. – hims056

3

Либо вы проверяете NULL значения

select * 
from not_in 
where name not in ('C') or name is null; 

или вы можете конвертировать NULL значения в любой другой символ с COALESCE. Я использую '' в примере ниже.

select * 
from not_in 
where coalesce(name, ' ') not in ('C');