Почему этот SQL-оператор возвращает 0
?NULL IN (1,2, NULL) возвращает false
SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END
Почему этот SQL-оператор возвращает 0
?NULL IN (1,2, NULL) возвращает false
SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END
Я не знаю, что RDBMS вы используете, так как некоторые из них имеет конфигурацию, как NULL
будет рассматриваться.
NULL IN (9, 1, NULL)
можно записать в виде
(NULL = 9) OR (NULL = 1) OR (NULL = NULL)
и не из них были TRUE
ни FALSE
. Все они NULL
. Поскольку в операторе CASE
имеется только два пути, он попадает под блок ELSE
.
Это зависит от того, как 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
Потому что вы не можете сравнить null
значения используя операторы сравнения. Вы можете использовать только is null
или is not null
или используя такие функции, как COALESCE()
, ISNULL()
. Например,
SELECT CASE WHEN COALESCE(NULL,-1) IN (9,1,-1) THEN 1 ELSE 0 END
Null mean not defined.
объект Null не равен NULL другой
NULL == 1 возвращение ложным
Null == 2 возврата ложного
NULL, NULL == возврата также ложные
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
Поскольку 'NULL = NULL' является' NULL' –
http://dba.stackexchange.com/questions/48643/query-to-find-guids-not-in-null-containing-subquery-returns -no-results/ – billinkc
Не переносите это на DBA.stackexchange. Это слишком основательно, и мы уже обращались к нему, поэтому его просто закрыли как дубликат. – billinkc