我在理解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。为什么呢?
答案 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
也是未知的,因为你不知道它是否相等。而且你知道两个未知数是否相等。同样适用于任何未知操作,当你添加一些未知的东西时,结果几乎不为你所知。