在SQL Server中,如果 nullParam=NULL在where子句中,它总是计算为false.这是违反直觉的,并且给我带来了许多错误.我确实理解IS NULL和IS NOT NULL关键字是正确的方法.但是为什么SQL服务器会以这种方式运行?
我很惊讶地看到IS NULL和= NULL在select查询中产生不同的结果.他们之间有什么区别?什么时候用.如果你能详细解释我,我会很高兴的.
我没有问,如果它.我知道事实并非如此.
我很好奇原因.我已经阅读了支持文档,例如关于在MySQL中使用Nulls的支持文档,但它们并没有给出任何理由.他们只重复你必须使用的"是空"的口头禅.
这一直困扰着我.在进行动态SQL(那些必须要做的极少数时间)时,将"null"传递给where子句会更容易:
@where = "where GroupId = null"
Run Code Online (Sandbox Code Playgroud)
这将是常规变量的简单替换.相反,我们必须使用if/else块来执行以下操作:
if @groupId is null then
@where = "where GroupId is null"
else
@where = "where GroupId = @groupId"
end
Run Code Online (Sandbox Code Playgroud)
在更大更复杂的查询中,这是一个巨大的痛苦.有没有特定的原因,SQL和所有主要的RDBMS供应商都不允许这样做?它会产生某种关键字冲突或价值冲突?
编辑:
许多答案的问题(在我看来)是每个人都在设置null和"我不知道它的值是什么"之间的等价.这两件事之间存在巨大差异.如果null意味着"有一个值,但它是未知的"我会100%同意空值不能相等.但SQL null并不意味着.这意味着没有价值.任何两个为null的SQL结果都没有值. 没有价值不等于未知价值.两件不同的事情.这是一个重要的区别.
编辑2:
我遇到的另一个问题是其他HLL允许null = null完全正常并适当地解决它.例如,在C#中,null = null返回true.
我正在读这篇文章: 在SQL中获取null == null
并且一致认为,当尝试测试两个(可为空)sql列之间的相等性时,正确的方法是:
where ((A=B) OR (A IS NULL AND B IS NULL))
Run Code Online (Sandbox Code Playgroud)
当A和B为NULL时,(A = B)仍然返回FALSE,因为NULL不等于NULL.这就是需要额外检查的原因.
在测试不平等时呢?根据上面的讨论,它让我认为,为了测试不平等,我需要做一些像:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)
但是,我注意到这没有必要(至少在informix 11.5上没有),我可以这样做:
where (A<>B)
Run Code Online (Sandbox Code Playgroud)
如果A和B为NULL,则返回FALSE.如果NULL不等于NULL,那么这不应该返回TRUE吗?
编辑
这些都是很好的答案,但我认为我的问题有点模糊.请允许我改写一下:
鉴于A或B都可以为NULL,是否足以检查它们的不等式
where (A<>B)
Run Code Online (Sandbox Code Playgroud)
或者我需要明确检查它:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)
请参阅此主题以获得此问题的答案.
如何检查值IS NULL [or] = @param(@param为null)
例如:
Select column1 from Table1
where column2 IS NULL => works fine
Run Code Online (Sandbox Code Playgroud)
如果我想用@param替换比较值(IS NULL).如何才能做到这一点
Select column1 from Table1
where column2 = @param => this works fine until @param got some value in it and if is null never finds a record.
Run Code Online (Sandbox Code Playgroud)
这怎么能实现?