2013-09-26 3 views
0

Почему этот SQL-оператор возвращает 0?NULL IN (1,2, NULL) возвращает false

SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END 
+3

Поскольку 'NULL = NULL' является' NULL' –

+1

http://dba.stackexchange.com/questions/48643/query-to-find-guids-not-in-null-containing-subquery-returns -no-results/ – billinkc

+1

Не переносите это на DBA.stackexchange. Это слишком основательно, и мы уже обращались к нему, поэтому его просто закрыли как дубликат. – billinkc

ответ

2

Я не знаю, что RDBMS вы используете, так как некоторые из них имеет конфигурацию, как NULL будет рассматриваться.

NULL IN (9, 1, NULL) 

можно записать в виде

(NULL = 9) OR (NULL = 1) OR (NULL = NULL) 

и не из них были TRUE ни FALSE. Все они NULL. Поскольку в операторе CASE имеется только два пути, он попадает под блок ELSE.

0

Это зависит от того, как NULL обрабатывается на определенном сервере.

Например, в SQL SERVER вы можете установить ANSI_NULLS покинуть и он возвращает 1:

SET ANSI_NULLS OFF 

SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END 

Для получения дополнительной информации вы должны прочитать раздел примечаний SET ANSI_NULLS

0

Потому что вы не можете сравнить null значения используя операторы сравнения. Вы можете использовать только is null или is not null или используя такие функции, как COALESCE(), ISNULL(). Например,

SELECT CASE WHEN COALESCE(NULL,-1) IN (9,1,-1) THEN 1 ELSE 0 END 
0

Null mean not defined.

объект Null не равен NULL другой

NULL == 1 возвращение ложным

Null == 2 возврата ложного

NULL, NULL == возврата также ложные

3

SQL основано на three-valued logic, где имеется три значения истинности: TRUE, FALSE и UNKNOWN. Специальное значение NULL является заполнителем для «отсутствующих данных», и если вы что-то сравниваете, что угодно, с отсутствующими данными результат неизвестен. Например, <missing data><missing data>? Это невозможно узнать, поэтому результат UNKNOWN.

В данном конкретном случае вы пытаетесь выяснить, находится ли <missing data> в данном списке: поскольку данные отсутствуют, невозможно узнать, находится ли он в списке, а запрос возвращает 0.

SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END 
Смежные вопросы