如果在复杂的参数集中使用,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)
答案 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
成为以下内容:
(A AND B) AND C AND D
((A AND B) AND C) AND D
(((A AND B) AND C) AND D)
强> 谓词的复杂性不会改变这个顺序,如果你想要一个不同的顺序,你总是可以明确地使用括号。