在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.