У меня нет простой логической алгебры на моем sql-сервере.Согласно msdn, следующий оператор должен возвращать «1», но на моем сервере он возвращает «0».Вы можете помочь мне?
SET ANSI_NULLS ON
SELECT CASE WHEN NOT(1=NULL) THEN 1 ELSE 0 END
Пожалуйста, посмотрите на msdn .Там ясно сказано: «Сравнение NULL со значением, отличным от NULL, всегда приводит к FALSE».- независимо от того, что параметр ANSI_NULLS.Таким образом, «1 = NULL» должно быть ЛОЖЬ, а NOT (FALSE) должно быть ИСТИНА, а оператор должен возвращать «1».
Но на моем компьютере он возвращает «0»!
Одним из объяснений может быть то, что «1 = NULL» оценивается как «НЕИЗВЕСТНО».NOT (UNKNOWN) по-прежнему UNKNOWN ( msdn ), что приведет к принудительному применению оператора CASE в ELSE.
Но тогда официальная документация оператора equals будет неправильной.Я не могу в это поверить!
Кто-нибудь может объяснить это поведение?
Большое спасибо за любую помощь!
Редактировать (2012-03-15):
Одна вещь, которую я только что обнаружил, которая может быть интересна для некоторых из вас:
CREATE TABLE #FooTest (Value INT)
ALTER TABLE #FooTest WITH CHECK ADD CONSTRAINT ccFooTestValue CHECK (Value>1)
PRINT '(NULL>1) = ' + CASE WHEN NULL>1 THEN 'True' ELSE 'False' END
INSERT INTO #FooTest (Value) VALUES (NULL)
Print-Statement пишет «False», но вставка выполняется без ошибок.SQL-Server, по-видимому, отрицает проверочное ограничение, чтобы искать строки, которые не выполняют проверку ограничения:
IF EXISTS (SELECT * FROM inserted WHERE NOT(Value>NULL)) <Generate error>
Поскольку проверочное ограничение оценивается как UNKNOWN, отрицание также UNKNOWN и SqlServerне находит ни одной строки, нарушающей ограничение проверки.