В чем разница между != и не является? И Nulls в целом

#sql-server #sql-server-2000

#sql-server #sql-server-2000

Вопрос:

Мне немного сложно понять, как t-sql обрабатывает нулевые значения.

Как парень с #, я, как правило, хочу сделать

 IF(@myVar != null)...
  

Но, похоже, это никогда не запускает мой код. Так что я делаю

 IF(@myVar is not null)
  

В чем разница?

Во-вторых, неясно, как работает сложение. Допустим, у меня есть

 declare @someCount int, @someFinalResult int

--Select that returns null
SELECT @someCount = columnName from tableName where someColumn = someValue
  

Тогда, если я сделаю

 SET @someFinalResult = @someCount   1--I seem to get NULL if I had null   something
  

Но, если я сначала

 declare @someCount int, @someFinalResult int
--FIRST SET DEFAULT TO 0
SET @someCount = 0

--Select that returns null
SELECT @someCount = columnName from tableName where someColumn = someValue
  

Теперь по @someCount умолчанию установлено значение 0, на самом деле оно не равно NULL, даже если результат равен null. Почему?

Ответ №1:

Когда вы имеете дело с NULL в SQL Server, вы в основном работаете с 3-значной логикой со всеми вытекающими последствиями.

Итак, в вашем примере

IF(@myVar != null) против IF(@myVar is not null)

Это в основном сводится к вопросу, в чем разница между: @myVar = null vs @myVar is null

@myVar = null всегда будет оцениваться как null, поскольку то, что вы спрашиваете,:

равно ли значение в @myVar НЕИЗВЕСТНОМУ

Поскольку вы не знаете, что такое НЕИЗВЕСТНЫЙ, на этот вопрос нельзя ответить «да» или «нет», поэтому он оценивается как НЕИЗВЕСТНЫЙ

 e.g. 
    "is 1 = UNKNOWN" - I do not know
    "is 'a' = UNKNOWN" - I do not know 
    "is UNKNOWN = UNKNOWN" - I do not know
  

Последнее может быть немного сложным, но просто представьте, что у вас есть 2 коробки с яблоками, и вы не знаете, ни сколько яблок в box1, ни в box2, поэтому спрашиваете:

 is count(box1) = count(box2)
is the same as 
is UNKNOWN = UNKNOWN"
  

итак, ответ I do not know

второй @myVar is null отличается тем, что он похож на запрос

 is the value in @myVar UNKNOWN
  

итак, разница в том, что вы конкретно спрашиваете: «Правда ли, что значение, хранящееся в переменной, НЕИЗВЕСТНО?», так что

     "is 1 UNKNOWN" - NO
    "is 'a' UNKNOWN" - NO
    "is UNKNOWN UNKNOWN" - YES
  

Ответ №2:

В общем, это так: NULL неизвестно, поэтому !=NULL также неизвестно, потому что вы не знаете, равно это или нет. И вы знаете еще меньше, равны ли два неизвестных. То же самое касается более или менее любой операции с неизвестными, когда вы добавляете что-то в unknown, результат вряд ли вам больше известен.