我们的sql中有一个条件
and (A is null or (A is not null and B is null))
我认为这等同于
and (A is null or B is null)
我检查了所有组合项目(A为空,B为空...)。看来它们是等效的。
答案 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
必须为真。这就是IS
和IS 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
因此,它们是等效的。