有什么区别!=和不是?而且一般都是空的

时间:2011-10-27 14:17:10

标签: sql-server sql-server-2000

我在理解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,它实际上也不会设置为NULL。为什么呢?

2 个答案:

答案 0 :(得分:3)

当您处理NULL in SQL Server时,您基本上与3-value logic一起使用所有implications

所以在你的例子中

IF(@myVar != null) vs IF(@myVar is not null)

它基本上归结为以下问题:@myVar = null@myVar is null

之间的区别

@myVar = null将始终评估为null,因为您要求的是:

  

是@myVar 中等于 UNKNOWN

的值

由于你不知道UNKNOWN是什么,这个问题不能回答是,否则它会评估为 UNKNOWN

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

最后一个可能有点棘手,但想象一下你有两个带苹果的盒子,你不知道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

所以区别在于你特别问“存储在变量中的值是否为UNKNOWN?”,所以

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

答案 1 :(得分:1)

通常,它是这样的:NULL未知,所以!=NULL也是未知的,因为你不知道它是否相等。而且你知道两个未知数是否相等。同样适用于任何未知操作,当你添加一些未知的东西时,结果几乎不为你所知。