这两个条件是否等效(在sql中)?

时间:2018-11-29 01:06:15

标签: sql logic

我们的sql中有一个条件

and (A is null or (A is not null and B is null))

我认为这等同于

and (A is null or B is null)

我检查了所有组合项目(A为空,B为空...)。看来它们是等效的。

4 个答案:

答案 0 :(得分:2)

是的,简单的答案是它们产生相同的结果集。

两个条件都是等价,但不是等于。继续阅读。

请记住,不同的数据库具有更好或更差的优化器。由于SQL是一种声明性语言,因此某些优化程序将能够简化或重写 SQL条件并利用某些索引,而其他更笨拙的优化程序则不会。

总而言之,使用一种或多种条件时,您可能会看到一些差异。特别是:

  • 更高/更低的性能。某些数据库将能够产生更好的[更智能]执行计划,从而更快和/或更少地占用资源。
  • 不同的行顺序。根据执行计划,在没有ORDER BY子句的情况下,某些数据库将以不同的顺序或使用不同的索引遍历表堆,并且您将以不同的顺序获得相同的行。

答案 1 :(得分:1)

这两个表达式确实是相同的。

A is null or (A is not null and B is null)

如果A is null为假,则意味着A is not null必须为真。这就是ISIS NOT的原理。换句话说,在表达式A is null or (A is not null and B is null)中,表示A is not null的部分是多余的:我们已经知道情况确实如此,作为表达式的第一个条件,A is null没有被填充。

因此,您应该使用第二种形式,其语法并不多余,甚至可能会更好,具体取决于您的RDBMS的智能程度:

and (A is null or B is null)

答案 2 :(得分:1)

是的,您还可以使用速度更快的(((A + B)为空))。

答案 3 :(得分:0)

这是基本逻辑。您可以使用真值表进行检查:

A        B        expr1      expr2
NULL     NULL     TRUE       TRUE
NULL     not      TRUE       TRUE
not      NULL     TRUE       TRUE
not      not      FALSE      FALSE

因此,它们是等效的。