共用方式為


在準則窗格中組合搜尋條件的慣例

您可以建立包含任何數目搜尋條件的查詢,其中使用任何數目的 AND 和 OR 運算子加以連結。 使用 AND 和 OR 子句組合的查詢會變得很複雜,因此,瞭解這類查詢在執行時的解譯方式,以及這類查詢在準則窗格SQL 窗格中的表現方式,是有幫助的。

注意事項注意事項

如需只包含一個 AND 或 OR 運算子之搜尋條件的詳細資訊,請參閱 HOW TO:指定單一資料行的多重搜尋條件HOW TO:指定多重資料行的多重搜尋條件

下列資訊是關於:

  • 同時包含 AND 和 OR 運算子的查詢中,運算子的優先順序。

  • AND 和 OR 子句之條件彼此的邏輯關係。

  • [查詢和檢視表設計工具] 在 [準則] 窗格中表示包含 AND 和 OR 查詢的方式。

為了協助您瞭解下列的討論,試想您正在使用包含 hire_date、job_lvl 和 status 的 employee 資料行的資料表。 範例假設您想知道某個員工在公司的年資 (員工的雇用日期)、員工負責的工作類型 (工作階層) 以及員工的狀態 (例如已退休) 等資訊。

AND 和 OR 的優先順序

執行查詢時,查詢會先評估以 AND 連結的子句,然後再評估以 OR 連結的子句。

注意事項注意事項

NOT 運算子的優先順序高於 AND 和 OR。

例如,要尋找在公司年資超過五年擔任低階工作的員工,或者不論年資擔任中階工作的員工,可以依照以下範例建構一個 WHERE 子句:

WHERE 
   hire_date < '01/01/90' AND 
   job_lvl = 100 OR
   job_lvl = 200
   

若要覆寫 AND 先於 OR 的預設優先順序,可以在 [SQL] 窗格中使用括號括住特定的條件。 括號裡的條件一定是第一個進行評估。 例如,要尋找在公司年資超過五年擔任低階或中階工作的員工,可以建構如下的 WHERE 子句:

WHERE 
   hire_date < '01/01/90' AND 
   (job_lvl = 100 OR job_lvl = 200)
秘訣秘訣

為了保持明確,AND 和 OR 合併使用時,建議您加上括號,不要依賴預設的優先順序。

AND 和多個 OR 子句配合的方式

瞭解 AND 和 OR 子句合併使用時彼此之間的關係,可幫助您建構及暸解 [查詢和檢視表設計工具] 中複雜的查詢。

如果使用 AND 連結多個條件,以 AND 連結的第一組條件套用於第二組裡的所有條件。 換句話說,使用 AND 和另一個條件連結的條件會分散至第二組裡的所有條件。 例如,下列式子顯示連結至一組 OR 條件的 AND 條件:

A AND (B OR C)

以上式子在邏輯上等於下面的式子,顯示 AND 條件是如何分散至第二組條件:

(A AND B) OR (A AND C)

此分散原則會影響使用 [查詢和檢視表設計工具] 的方式。 例如,想像一下您要尋找年資五年以上擔任低階或中階工作的員工。 在 [SQL] 窗格的陳述式中輸入以下的 WHERE 子句:

WHERE (hire_date < '01/01/90' ) AND 
   (job_lvl = 100 OR job_lvl = 200)

以 AND 連結的子句會同寺套用至以 OR 連結的兩個子句。 明確表示這種情形的方法是在 OR 子句裡的每一個條件重複一次 AND 條件。 以下的陳述式比前面的陳述式更明確 (也更長),但是在邏輯上相等:

WHERE    (hire_date < '01/01/90' ) AND
  (job_lvl = 100) OR 
  (hire_date < '01/01/90' ) AND 
  (job_lvl = 200)

不論有多少個別的條件,將 AND 子句分散至以 OR 連結之子句的原則都適用。 例如,想像您要尋找在年資超過五年或已退休的高階或中階員工。 產生的 WHERE 子句將如下所示:

WHERE 
   (job_lvl = 200 OR job_lvl = 300) AND
   (hire_date < '01/01/90' ) OR (status = 'R')

分散了使用 AND 連結的條件以後,產生的 WHERE 子句將如下所示:

WHERE 
   (job_lvl = 200 AND hire_date < '01/01/90' ) OR
   (job_lvl = 200 AND status = 'R') OR
   (job_lvl = 300 AND hire_date < '01/01/90' ) OR
   (job_lvl = 300 AND status = 'R') 

多個 AND 和 OR 子句在準則窗格中表示的方式

[查詢和檢視表設計工具] 會在準則窗格中呈現您的搜尋條件。 然而,如果以 AND 和 OR 連結多個子句,[準則] 窗格中呈現的可能就不是您所預料的結果。 此外,如果您在 [準則] 窗格 或圖表窗格中修改查詢,將會發現原先輸入的 SQL 陳述式已經變更。

一般而言,這些規則指示了 AND 和 OR 子句在 [準則] 窗格中顯示的方式:

  • 以 AND 連結的所有條件,出現在 [篩選條件] 方格欄位或同一個 [] 欄位中。

  • 以 OR 連結的所有條件,出現在不同的 [] 欄位中。

  • 如果 AND 和 OR 子句合併的邏輯結果是 AND 分散至數個 OR 子句,[準則窗格] 會以需要的次數來重複 AND 子句,以明確其合併邏輯。

例如,您可以在 [SQL] 窗格中建立如下的搜尋條件,利用 AND 連結的兩個子句優先於使用 OR 連結的第三個子句:

WHERE (hire_date < '01/01/90' ) AND 
  (job_lvl = 100) OR 
  (status = 'R')

[查詢和檢視表設計工具] 在 [準則] 窗格會以下列方式表示這個 WHERE 子句:

準則窗格中的 WHERE 子句

但是,如果連結的 OR 子句優先於 AND 子句,將會為每一個 OR 子句重複 AND 子句。 這會使得 AND 子句分散至每一個 OR 子句。 例如,在 [SQL] 窗格中建立 WHERE 子句,如下所示:

WHERE (hire_date < '01/01/90' ) AND 
  ( (job_lvl = 100) OR 
  (status = 'R') )

[查詢和檢視表設計工具] 在 [準則] 窗格會以下列方式表示這個 WHERE 子句:

準則窗格中的 WHERE 子句 2

如果連結的 OR 子句只牽涉到一個資料行,[查詢和檢視表設計工具] 可以將整個 OR 子句放入方格的單一儲存格內,避免重複 AND 子句的必要。 例如,在 [SQL] 窗格中建立 WHERE 子句,如下所示:

WHERE (hire_date < '01/01/90' ) AND 
  ((status = 'R') OR (status = 'A'))

[查詢和檢視表設計工具] 在 [準則] 窗格會以下列方式表示這個 WHERE 子句:

準則窗格中的 WHERE 子句 3

如果您變更查詢 (例如,在 [準則] 窗格中變更其中一個值),[查詢和檢視表設計工具] 會在 [SQL] 窗格中重建 SQL 陳述式。 重建的 SQL 陳述式,和 [準則] 窗格中顯示的內容類似,而不是和原始陳述式類似。 例如,[準則] 窗格中如果包含了分散式 AND 子句,[SQL] 窗格中產生的陳述式將會以明確的方式重建分散式 AND 子句。 如需詳細資訊,請參閱此主題中的<AND 和多個 OR 子句配合的方式>。

請參閱

其他資源

指定搜尋準則

參考 (Visual Database Tools)