簡體   English   中英

關於sql和邏輯。 在sql where子句中,“ not(p and q)”等於“(not p)or(not q)”

[英]About sql and logic. In the sql where clause, is “not (p and q)” equal to “(not p) or (not q)”

SQL和邏輯問題。 where子句中,是

not (p and q)

等於

(not p) or (not q)

請參考工作提琴

查詢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)是正確的!

是。 德摩根的法律與語言無關。

盡管答案有點晚,但是您在這里談論的是De Morgan's Law 所以你的邏輯not (p and q)將轉換為

not p or not q

原因否定(否)將應用於語句(p and q)

不是p

not and將轉換為or

不是q

盡管這兩個表達式在邏輯上是等效的,但它們在功能上可能並不等效。 它取決於pq的性質以及語言優化器的操作。

例如,考慮p為假。 (not p) or (not q) ,我們可以推斷出表達式為真,而不必求q 一個聰明的優化器,可以理解or可能會這樣捷徑。 但是我們不能在not (p and q)存在的情況下這樣做(除非我們的理論優化器本身可以首先應用de Morgan)。

有誰知道SQL Server或Oracle或其他主要參與者是否在進行這種優化?

結果可能不只是節省了性能。 假設q不僅僅是一個簡單的布爾變量,而是一個包含執行一些更復雜函數的表達式。 如果該函數除了返回真值以外還具有其他副作用,那么通過優化對q的求值,我們也不會看到這些副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM