在準則窗格中組合搜尋條件的慣例
您可以建立包含任何數目搜尋條件的查詢,其中使用任何數目的 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 子句:
但是,如果連結的 OR 子句優先於 AND 子句,將會為每一個 OR 子句重複 AND 子句。 這會使得 AND 子句分散至每一個 OR 子句。 例如,在 [SQL] 窗格中建立 WHERE 子句,如下所示:
WHERE (hire_date < '01/01/90' ) AND
( (job_lvl = 100) OR
(status = 'R') )
[查詢和檢視表設計工具] 在 [準則] 窗格會以下列方式表示這個 WHERE 子句:
如果連結的 OR 子句只牽涉到一個資料行,[查詢和檢視表設計工具] 可以將整個 OR 子句放入方格的單一儲存格內,避免重複 AND 子句的必要。 例如,在 [SQL] 窗格中建立 WHERE 子句,如下所示:
WHERE (hire_date < '01/01/90' ) AND
((status = 'R') OR (status = 'A'))
[查詢和檢視表設計工具] 在 [準則] 窗格會以下列方式表示這個 WHERE 子句:
如果您變更查詢 (例如,在 [準則] 窗格中變更其中一個值),[查詢和檢視表設計工具] 會在 [SQL] 窗格中重建 SQL 陳述式。 重建的 SQL 陳述式,和 [準則] 窗格中顯示的內容類似,而不是和原始陳述式類似。 例如,[準則] 窗格中如果包含了分散式 AND 子句,[SQL] 窗格中產生的陳述式將會以明確的方式重建分散式 AND 子句。 如需詳細資訊,請參閱此主題中的<AND 和多個 OR 子句配合的方式>。