使用NOT也使用OR

时间:2015-08-19 17:20:58

标签: sql-server tsql operator-precedence

如果在复杂的参数集中使用,NOT条件是仅适用于第一个参数还是所有后续参数?

e.g。在merge语句的以下片段中,NOT运算符仅适用于

TGT.OrderID = SRC.OrderID参数?

https://msdn.microsoft.com/en-us/library/ms190276.aspx建议在OR之前评估NOT。 这是否意味着它应用于所有参数,或者我需要为每个被否定的参数添加一个新参数 - 在这种情况下,我需要在第四个和第七个参数中添加一个参数。

WHEN MATCHED AND NOT TGT.OrderID = SRC.OrderID 
              OR(TGT.OrderID IS NULL AND SRC.OrderID IS NOT NULL)
              OR(TGT.OrderID IS NOT NULL AND SRC.OrderID IS NULL)
              OR TGT.EmpID = SRC.EmpID
              OR(TGT.EmpID IS NULL AND SRC.EmpID IS NOT NULL) 
              OR(TGT.EmpID IS NOT NULL AND SRC.EmpID IS NULL) 
              OR TGT.orderdate = SRC.OrderDate
              OR(TGT.Orderdate IS NULL AND SRC.Orderdate IS NOT NULL)
              OR(TGT.Orderdate IS NOT NULL AND SRC.Orderdate IS NULL)

2 个答案:

答案 0 :(得分:3)

“在OR之前计算NOT”意味着NOT运算符优先于OR,这意味着它将取消紧随其后的语句,在本例中为“TGT.OrderID = SRC.OrderID”。之后,解释器将执行OR语句。

将其视为-A + B.-只影响A,而不是B.如果您想要-A + -B,您必须这样做,或者您可以使用括号来更改评估,例如 - (A + B)

答案 1 :(得分:0)

运营商优先级https://msdn.microsoft.com/en-us/library/ms190276.aspx

AND,OR和NOT的评估顺序是:

  • NOT
  • AND
  • OR

这意味着如果你有一个谓词: NOT A AND B OR C AND NOT D 有时候是这样的: 首先应用NOT

(NOT A) AND B OR C AND (NOT D)

AND下一步申请:

((NOT A) AND B) OR (C AND (NOT D))

OR最后应用

<强> (((NOT A) AND B) OR (C AND (NOT D)))

如果两个具有相同的优先级,则从左到右应用它。

A AND B AND C AND D

成为以下内容:

  1. (A AND B) AND C AND D
  2. ((A AND B) AND C) AND D
  3. (((A AND B) AND C) AND D)
  4. 谓词的复杂性不会改变这个顺序,如果你想要一个不同的顺序,你总是可以明确地使用括号。