2010-11-05 103 views
1

我正在处理存储过程,并且希望检查我的表变量以查看是否存在特定字段等于null的零行。换句话说,对于我表中的每一行,此字段都有一个非空值。我想不通过检查count(),而是通过使用EXISTS。SQL:检查某个表是否包含特定列中没有空值

目前我在做这个:

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子句做我想做的事情,但是我找不到它,并忽略它的书签。虽然也许我错了。

我设置一个if/else的原因是因为根据我的理解,EXISTS将在NOT EXISTS之前返回,因为这是一个相当密集的存储过程(很频繁地调用,有时是批量调用),我希望能够保存一些在这里处理。

也许我看着这一切都错了或承担错误的东西。我在这里学习,所以如果我把所有的错误都指向正确的方向。

编辑:显然在这方面没有什么区别(不是where子句/子查询的一部分)。但是假设我在where子句中使用了存在,并且希望检查上面的确切场景(字段中的所有非空值),特别是当有问题的表可能有成千上万行时。 [种新的SO,如果我应该把它作为自己的问题,请让我知道]

+0

的** **所有非空值检查在其中一个主查询的WHERE子句基本上是相同的情况下,因为它只会在每个查询中执行一次。在子查询中检查所有非空值是非常糟糕的主意,因为每次执行子查询时都需要对相关表进行表扫描。 – 2010-11-05 13:58:14

回答

3

这种格式的EXISTS或NOT EXISTS都会在找到一行并在适当情况下给出true/false时停止。

的IF将相应地跳,还有这里不多优化...

+0

当你说“这种格式”是指你的查询中的where子句不是它的一部分吗?如果是这样,(我知道它是一个完全不同的问题)那里有什么区别? – pinkfloydx33 2010-11-05 11:36:14

+0

对不起,不是子查询的一部分。如果你在这里和那里有IF EXISTS(SELECT WHERE EXISTS()),那么他们可以在某些查询中给出不同的结果 – gbn 2010-11-05 11:38:15

0

NOT EXISTSEXISTS应该花费相同的时间量。任何一个都可以通过首先计算另一个并且否定结果来导出。

+0

在他的例子中,我们不会期望'NOT EXISTS'因为基础逻辑而花费更长时间(他将在所有行上查找“NOT NULL”,而不是在单行上查找“NULL”)。 – JNK 2010-11-05 12:45:09

+0

@JNK:否 - 如果任何记录中没有NULL,则查询的任何版本都必须检查表中的每条记录,而如果在任何地方都有NULL,则两个查询都会运行,直到找到第一个NULL。 – 2010-11-05 14:02:51

+1

@JNK:'NOT EXISTS(SELECT * FROM @sometable WHERE something IS NOT NULL)'测试*每行*为空,这根本不是一回事。 – 2010-11-06 01:25:45

相关问题