#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, результат вряд ли вам больше известен.