Какая разница между! = И нет?И нули в общем - PullRequest
1 голос
/ 27 октября 2011

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

Как парень на C #, я склонен делать

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, даже если результат равен нулю. Почему?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

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

Так что вВаш пример

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

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

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

- это значение в @myVar , равное UNKNOWN

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

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

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

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
1 голос
/ 27 октября 2011

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

...