2016-03-24 28 views
0

我使用SQL Server查詢倍數,&或包圍其中多次使用的條款,&或

例如 我的問題是我應該把打開和關閉支架上或ProductCode1,ProductCode2 &之間聲明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) 
+3

它取決於你的過濾條件。 –

+1

就我個人而言,每次我在WHERE子句中結合AND和OR時,爲了清楚起見,當其他人讀取查詢時,我會使用括號。 – paulbailey

回答

1

我猜你查詢的目的是要找到具有SalesDate大於或等於「2015年1月1日」記錄,並在列出的一組有產品名稱和具有的一個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

2

該關鍵字是運算符優先級..它定義了運算符評估的順序。在SQL方言中(實際上在每種編程語言中),我知道,AND運算符的優先級高於OR運算符。

當與您的示例(與條件A至E),則表達式::然而,在該運算符的計算順序可以通過使用parenthesises控制

A AND B AND C OR D OR E 

等價於下面的表達式:

(A AND B AND C) OR D OR E 

這意味着,下列情況之一必須爲真:

  • 一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