SQL Server查询中AND和OR的操作顺序

时间:2017-07-21 07:22:40

标签: sql-server

我有一个sql语句(继承),它有以下WHERE子句:

WHERE
          (Users_1.SecurityLevel IN ('Accounts', 'General manager'))
      AND (PurchaseOrders.Approval = 1)
      AND (PurchaseOrders.QuotedAmount = 0)
      AND (Users_1.StaffNumber = ISNULL(ServiceRequests.POC_UserID, PurchaseOrders.Approval_UserID))
      OR
      (Users_1.SecurityLevel IN ('Accounts', 'General manager'))
      AND (PurchaseOrders.QuotedAmount = 0)
      AND (ServiceRequests.POC = 1)
      AND (Users_1.StaffNumber = ISNULL(ServiceRequests.POC_UserID, PurchaseOrders.Approval_UserID))
      OR  
        (ISNULL(ISNULL(PurchaseOrders.InvoiceNumber, ServiceRequests.InvoiceNumber), '!#') <> '!#')
      AND (Users_1.StaffNumber = ISNULL(ServiceRequests.POC_UserID, PurchaseOrders.Approval_UserID))

我正试图弄清楚当事情没有很好地置于括号内时的操作顺序。

上述示例中如何排序AND和OR语句?

是否有一个简单的规则,以便我可以在事物周围添加括号以使其更具可读性?

对于SQL WHERE子句运算符,我正在寻找类似于操作的数学顺序的“BODMAS”。

由于

1 个答案:

答案 0 :(得分:3)

Operator Precedence上的页面告诉您:

  

当复杂表达式具有多个运算符时,运算符优先级确定执行运算的顺序。执行顺序可能会显着影响结果值。

AND的优先级高于OR

然而,它不正确。在SQL中,您告诉系统您想要什么,而不是如何操作,并且优化器可以自由地重新排序操作,前提是相同的逻辑生成结果

因此,虽然运算符优先级告诉您运算符如何在逻辑上组合,但实际上它并不控制实际执行每条逻辑的顺序。这意味着由于保证执行顺序而在其他语言中可能安全的习语在SQL中实际上并不安全。例如。支票如:

<String can be parsed as an int> && <convert the string to an int and compare to 20>

在C#等语言中可以完全安全。 SQL中的相同逻辑是不安全的,因为优化器可能会在评估字符串是否可以解析为int之前选择执行字符串到int转换,因此可以抛出有关转换失败的错误。 (当然,它也可以按照您的预期工作而不会产生错误)