SQL和逻辑问题。在where
子句中,是
not (p and q)
等于
(not p) or (not q)
答案 0 :(得分:2)
查询1:不是(p和q)
select * from table1
where
!(p = 1 and q=1);
查询2 :(不是p)或(不是q)
select * from table1
where p!=1 or q!=1;
输出没有区别,因此布尔代数逻辑!(p and Q) = (!p) or (!q)
是真的!!!
答案 1 :(得分:2)
是。 De Morgan's laws与语言无关。
答案 2 :(得分:0)
虽然回答有点迟,但你所说的是De Morgan's Law
。因此,您的逻辑not (p and q)
将转换为
not p or not q
原因否定(不)将适用于语句(p and q)
不是p
not and
将转换为or
不是q
答案 3 :(得分:0)
虽然这两个表达式在逻辑上是等价的,但它们可能在功能上不相同。这取决于p
和q
的性质以及语言优化的操作。
例如,考虑p
是错误的。在(not p) or (not q)
的情况下,我们可以推断出表达式是真的而无需评估q
。理解or
的聪明优化者可能会采取类似的捷径。但是在not (p and q)
的情况下我们不能这样做(除非我们理论化的优化者本身首先应用de Morgan)。
有人知道SQL Server或Oracle或其他主要参与者是否进行了此类优化吗?
结果可能不仅仅是节省性能。假设q
不仅仅是一个简单的布尔变量,而是一些包含执行更复杂函数的表达式。如果该函数除了返回真值之外还有副作用,那么通过优化q
的评估,我们也不会看到那些副作用。