包括多次使用AND& amp;要么

时间:2016-03-24 15:33:42

标签: sql sql-server

我在SQL Server中使用Multiple AND& amp;或者

例如 我的问题是我应该在ProductCode1,ProductCode2和&之间的OR语句中打开和关闭括号。 ProductCode3。

我问的原因是。每次我放置括号并运行查询时,从括号中移除括号时会得到不同的结果吗?

SELECT ProdID, 
       Productname,  
       SalesDate,  
       ProductCode1,
       ProductCode2
FROM Product_Table
WHERE  SalesDate >= ‘2015-01-01’
    AND  Productname IN (‘CA’,’DC’,’BF’,’GH’,’TQR’,’VXT’)
     AND ProductCode1  IN (232, 878, 287, 986, 672)
     OR ProductCode2 IN (213, 543, 971, 435,627)
     OR ProductCode3 IN (32, 89,67,45)

2 个答案:

答案 0 :(得分:2)

关键字是Operator Precedence ..它定义了运算符的评估顺序。在我知道的SQL方言中(实际上在每种编程语言中),AND运算符的优先级高于OR运算符。但是,可以使用括号来控制运算符的评估顺序:

与您的示例(条件A到E)进行比较时,表达式为:

A AND B AND C OR D OR E

等同于以下表达式:

(A AND B AND C) OR D OR E

这意味着,必须满足下列条件之一:

  • A和B和C
  • 或D
  • 或E

但根据你的例子,你可能想要这样的东西:

A AND B AND (C OR D OR E)

翻译成您的查询,它看起来像这样:

SELECT ...
FROM Product_Table
WHERE  SalesDate >= ‘2015-01-01’
    AND  Productname IN (‘CA’,’DC’,’BF’,’GH’,’TQR’,’VXT’)
    AND (ProductCode1  IN (232, 878, 287, 986, 672)
        OR ProductCode2 IN (213, 543, 971, 435,627)
        OR ProductCode3 IN (32, 89,67,45))

所以A和B必须为真,C,D或E也必须为真。翻译成你的例子,这看起来像:

例如,这是特定TSQL版本中所有运算符的完整列表及其优先级:https://msdn.microsoft.com/en-us/library/ms190276.aspx

答案 1 :(得分:1)

我猜你的查询的目的是查找SalesDate大于或等于'2015-01-01'的记录,并且在列出的集合中有一个Productname并且有一个productCode字段的值匹配您指定的集合。在这种情况下,您需要使用括号将所有productCode过滤器组合在一起。

   SELECT ProdID, 
           Productname,  
           SalesDate,  
           ProductCode1,
           ProductCode2
    FROM Product_Table
    WHERE  SalesDate >= ‘2015-01-01’
        AND  Productname IN (‘CA’,’DC’,’BF’,’GH’,’TQR’,’VXT’)
         AND (ProductCode1  IN (232, 878, 287, 986, 672)
              OR ProductCode2 IN (213, 543, 971, 435,627)
              OR ProductCode3 IN (32, 89,67,45))

这是使用AND和OR运算符的一个非常基本的组件。我很难为你找到一个很好的资源来解释它,但是 [maybe this will help]1