Оператор IN SQL - PullRequest
       1

Оператор IN SQL

3 голосов
/ 04 февраля 2010

У меня есть таблица NUMS с одним столбцом n.
И я заполняю значения 1,2,3,4,5, ноль в нем.

Теперь запрос

SELECT n FROM Nums 
 WHERE n IN (1, 2, null)

В этом случае, я думаю, он конвертируется в

SELECT n FROM Nums 
 Where n = 1 OR n = 2 OR n = null   

Я также сравниваю n с нулевым значением, которое должно давать неизвестное, и оно должно возвращать пустой набор. Но оно возвращает 1,2 (ноль не возвращается, хотя включено в оператор IN)

Теперь запрос

SELECT n FROM Nums WHERE n NOT IN(1, 2, null)  

... преобразуется в:

SELECT n FROM Nums 
 Where n!=1 AND n!=2 AND n!=null  

Вот то, что я сказал выше, работает и ничего не возвращает.

Может кто-нибудь объяснить подробно, что происходит.

Ответы [ 7 ]

5 голосов
/ 04 февраля 2010

Это потому, что null = null всегда ложно, оператор для использования со значением NULL равен IS или IS NOT. Вы можете использовать приведенный ниже запрос для ожидаемого результата

SELECT n FROM Nums WHERE n IN (1,2) OR n IS NULL

[Edit] Thanx @Buckwad

2 голосов
/ 04 февраля 2010

ОК, я нашел ответ

SELECT n FROM Nums    
WHERE n NOT IN (1, 2, null)

оценивается как

SELECT n FROM Nums  
n!=1 AND n!=2 AND n!=null

Результат последнего сравнения всегда будет НЕИЗВЕСТНЫМ.
и таблица истинности AND показывает, что как только в нее включается один Unknown (U, T) (U, F), (U, U), результатом может быть только U или F (U = Unknown, F = False) и, следовательно, он не будет включен в набор результатов.

В случае

SELECT n FROM Nums
WHERE n IN (1, 2, null) 

соответствует

SELECT n FROM Nums
WHERE n = 1 OR n =2 OR n=null

Теперь для строки с n = 1 операция n = 1 станет истинной
и для строки с n = 2 операция n = 2 выполнится как истинная
и для всех строк n = null будет неизвестен

Таким образом, он дает 1 и 2 в наборе результатов.
Надеюсь, людям это понравилось.
МОЖЕТ ЛИБО ПОЖАЛУЙСТА, ОТМЕТЬТЕ МОЙ ОТВЕТ КАК ОТВЕТ

1 голос
/ 04 февраля 2010

Вы не можете сравнивать напрямую с нулем.Чтобы определить, является ли значение столбца нулевым, вы должны использовать что-то вроде этого:

SELECT n
FROM Nums
WHERE n IS NULL
1 голос
/ 04 февраля 2010

ноль не возвращается, хотя включено в оператор IN

Из-за оценки n = NULL; NULL не может равно NULL. Это должно быть обработано как n IS NULL (или аналогичный соответствующий синтаксис), чтобы возвратить пустую строку / запись.

0 голосов
/ 04 февраля 2010
 SELECT n FROM Nums  
 WHERE n IN (1, 2)
  Or n Is null

Это восстановит то, что вы намереваетесь получить. Как сказал Митч, обычно сравнение с Null дает UNKNOWN. Это потому, что сам NULL определяется как неопределенное значение. Это как сказать, что я жил в Ноттингеме, Бирмингеме и где-то еще. Найти где-нибудь на карте мира может быть немного сложно, так как оно не определено.

0 голосов
/ 04 февраля 2010

Если список IN содержит значение NULL в любом месте, результат всего списка будет UNKNOWN

При правильном значении ANSI NULLS по умолчанию при сравнении NULL с NULL результат не соответствует действительности, но UNKNOWN

0 голосов
/ 04 февраля 2010

Я также сравниваю n с нулевым значением, которое должно привести к неизвестному, и должно возвращать пустой набор.

не должно, если вам нужна дополнительная строка, заполненная значениями NULLлучший способ imo это:

SELECT n FROM Nums WHERE n IN(1,2)
UNION
SELECT NULL

Теперь запрос

ВЫБЕРИТЕ N ИЗ NUM, ГДЕ НЕ IN (1, 2, НУЛЬ)

...gets, преобразованный в:

Здесь работает то, что я сказал выше, и ничего не возвращается.

верно, потому что ничто не может быть равно NULL, а для сравнения NULL утверждение NULLиспользуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...