【问题标题】:SQL: check if a table contains no nulls in a particular columnSQL:检查表是否在特定列中不包含空值
【发布时间】:2011-05-05 13:28:57
【问题描述】:

我正在处理一个存储过程,并且有一次我想检查我的表变量,看看是否有特定字段等于 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 子句中使用了存在,并且想要检查上面的确切情况(字段中的所有非空值),特别是当有问题的表可能有数千行时。 [对 SO 有点陌生,如果我应该将此作为自己的问题发布,请告诉我]

【问题讨论】:

  • 主查询的 where 子句中的 all 非空值检查本质上是相同的上下文,因为每个查询只会执行一次。在子查询中检查所有非空值是一个非常糟糕的主意,因为每次执行子查询时都需要对相关表进行表扫描。

标签: sql sql-server-2000 exists not-exists


【解决方案1】:

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

【讨论】:

  • 在他的示例中,由于底层逻辑,我们是否不希望 NOT EXISTS 花费更长的时间(他将在所有行上查找 NOT NULL 而不是在单个行上查找 NULL行)。
  • @JNK: 否 - 如果任何记录上都没有 NULL,则任一版本的查询都必须检查表中的每条记录,而如果任何地方都有 NULL,则两个查询都将运行直到找到第一个 NULL。
  • @JNK: NOT EXISTS (SELECT * FROM @sometable WHERE something IS NOT NULL) 测试 每一 行是否为空,这根本不是一回事。
【解决方案2】:

这种格式的 EXISTS 或 NOT EXISTS 都会在找到一行时停止,并根据需要给出 true/false。

IF 会相应地跳跃,这里没有太多需要优化的地方...

【讨论】:

  • 当您说“这种格式”时,您指的是它不是查询中 where 子句的一部分吗?如果是这样,(我知道这是一个完全不同的问题)那里会有什么区别?
  • 抱歉,不是子查询的一部分。如果你有 IF EXISTS(SELECT WHERE EXISTS()) 在这里和那里有 NOT,它们可以在某些查询中给出不同的结果
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 2020-10-08
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
相关资源
最近更新 更多