我正在处理一个存储过程,有一次我想检查我的表变量,看看是否有零行,特定字段等于null。换句话说,对于表中的每一行,此字段都具有非空值。我不想通过检查count(),但通过使用EXISTS来做到这一点。
目前我正在这样做:
IF EXISTS ( SELECT * FROM @sometable where somefield IS NULL )
SET @somefield = @somefield /* just a way to skip this */
ELSE
/* perform some logic */
现在我知道我可以使用NOT EXISTS,但我认为NOT EXISTS比EXISTS慢得多。我发誓我最近读了一些东西(我认为是这样的),它有一个例子,说明如何用一个Exists子句做我想做的事情,但我找不到它而忽略了将它加入书签。虽然也许我错了。
我设置if / else的原因是因为从我的理解EXISTS将在NOT EXISTS之前返回,因为这是一个非常密集的存储过程(经常调用,有时是批量调用)我希望保存一些处理这里。
也许我正在看这一切都错了或假设不正确。我在这里学习,如果我把这一切都搞错了,请指出我正确的方向。
编辑:显然这个上下文没有区别(不是where子句/子查询的一部分)。但是假设我在where子句中使用exists并且想要检查上面的确切场景(字段中的所有非空值),特别是当有问题的表可能有数千行时。 [SO的新内容,如果我发布这个问题,请告诉我]
答案 0 :(得分:3)
这种格式的EXISTS或NOT EXISTS在找到行时会停止,并在适当时给出true / false。
IF将相应地跳跃,并且在这里优化并不多......
答案 1 :(得分:0)
NOT EXISTS
和EXISTS
应该花费相同的时间。可以通过先计算另一个并否定结果来推导出任何一个。