在條件窗格中合併搜尋條件的慣例 (Visual Database Tools)

您可以建立使用任意多個 AND 和 OR 運算子連結,包含任何搜尋條件的查詢。含有 AND 及 OR 合併子句的查詢會變得複雜,這有助於瞭解此類查詢在您加以執行時是如何受到解譯,並瞭解此類查詢如何在 [準則] 窗格[SQL] 窗格中受到解譯。

[!附註]

如需只包含一個 AND 或 OR 運算子的搜尋條件的詳細資訊,請參閱<如何:指定單一資料行的多重搜尋條件 (Visual Database Tools)>和<如何:指定多重資料行的多重搜尋條件 (Visual Database Tools)>。

您可以在下面找到的資訊:

  • 同時包含 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 子句表示如下:

條件窗格中的 OR 子句優先順序

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

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

查詢和檢視設計師在 [準則] 窗格中將這個 WHERE 子句表示如下:

條件窗格中的多個 AND 和 OR 子句

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

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

查詢和檢視設計師在 [準則] 窗格中將這個 WHERE 子句表示如下:

條件窗格中定義的連結 OR 子句

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