关于sql和逻辑。在sql where子句中,是" not(p和q)"等于"(不是p)或(不是q)"

时间:2014-10-14 03:47:06

标签: sql logic

SQL和逻辑问题。在where子句中,是

not (p and q)

等于

(not p) or (not q)

4 个答案:

答案 0 :(得分:2)

参考working fiddle

查询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)

虽然这两个表达式在逻辑上是等价的,但它们可能在功能上不相同。这取决于pq的性质以及语言优化的操作。

例如,考虑p是错误的。在(not p) or (not q)的情况下,我们可以推断出表达式是真的而无需评估q。理解or的聪明优化者可能会采取类似的捷径。但是在not (p and q)的情况下我们不能这样做(除非我们理论化的优化者本身首先应用de Morgan)。

有人知道SQL Server或Oracle或其他主要参与者是否进行了此类优化吗?

结果可能不仅仅是节省性能。假设q不仅仅是一个简单的布尔变量,而是一些包含执行更复杂函数的表达式。如果该函数除了返回真值之外还有副作用,那么通过优化q的评估,我们也不会看到那些副作用。