適用於:SQL Server
您可以建立查詢,其中包含任意數目的搜尋條件,與任意數目 AND 和 OR 運算符連結。 具有 和 AND 子句組合的OR查詢可能會變得複雜,因此當您執行查詢時,瞭解如何解譯這類查詢,以及如何在準則窗格 (Visual Database Tools) 和 SQL 窗格 (Visual DatabaseTools) 中呈現這類查詢,會很有説明。
備註
如需僅包含一或ANDOR運算符之搜尋條件的詳細資訊,請參閱指定一個數據行的多個搜尋條件(Visual Database Tools)和指定多個數據行的多個搜尋條件(Visual Database Tools)。
在本文中,您會找到下列相關信息:
和 在包含這兩者的查詢中,和
AND的OR優先順序。和
AND子句中的OR條件如何以邏輯方式相互關聯。查詢和檢視表設計工具如何在包含
AND和OR的 [準則] 窗格中表示。
為了協助您瞭解下列討論,假設您正在使用包含 employee 、 和 hire_date資料行job_lvlstatus的數據表。 這些範例假設您需要知道員工與公司合作的時間長度(也就是員工雇用日期為何)、員工所執行的工作類型(工作等級為何),以及員工的狀態(例如退休)。
AND 和 OR 的優先順序
執行查詢時,它會先評估與 AND連結的 子句,然後再評估與 連結的 OR子句。
備註
運算子 NOT 的優先順序高於 AND 和 OR。
例如,若要在較低層級的工作中尋找已與公司一起工作超過五年的員工,或不考慮其僱用日期的員工,您可以建構 WHERE 如下的子句:
WHERE
hire_date < '01/01/95' AND
job_lvl = 100 OR
job_lvl = 200
若要覆寫 的預設優先順序 AND 高於 OR,您可以將括弧放在 SQL 窗格中的特定條件周圍。 括弧中的條件一律會先評估。 例如,若要尋找已與公司合作超過五年或中層工作的所有員工,您可以建構 WHERE 子句,如下所示:
WHERE
hire_date < '01/01/95' AND
(job_lvl = 100 OR job_lvl = 200)
小提示
為了清楚起見,建議您在合併 AND 和 OR 子句時一律包含括弧,而不是依賴預設優先順序。
AND 如何搭配多個 OR 子句運作
了解結合時的 和 AND 子句如何OR相關,可協助您在查詢和檢視表設計工具中建構和瞭解複雜的查詢。
如果您使用 連結多個條件 AND,則與 連結 AND 的第一組條件會套用至第二個集合中的所有條件。 換句話說,連結 AND 至另一個條件的條件會散發到第二個集合中的所有條件。 例如,下列圖解表示法顯示 AND 連結至一組 OR 條件的條件:
A AND (B OR C)
上述表示法在邏輯上相當於下列圖解表示法,其中顯示條件如何 AND 分佈至第二組條件:
(A AND B) OR (A AND C)
此分配原則會影響您使用查詢和檢視表設計工具的方式。 例如,假設您正在尋找所有與公司合作超過五年的員工,無論是中低級工作還是中層工作。 您會在 SQL 窗格中的 語句中輸入下列 WHERE 子句:
WHERE (hire_date < '01/01/95') AND
(job_lvl = 100 OR job_lvl = 200)
連結的 AND 子句會套用至與 OR連結的兩個子句。 表達這個的明確方式是針對 子句中的每個AND條件重複一OR次條件。 下列語句比上一個語句更明確(且較長),但邏輯上相當於它:
WHERE (hire_date < '01/01/95') AND
(job_lvl = 100) OR
(hire_date < '01/01/95') AND
(job_lvl = 200)
無論涉及多少個別條件,都適用將 AND 子句散發至連結 OR 子句的原則。 例如,假設您想要找到已與公司一起超過五年或已退休的中層員工。 子 WHERE 句看起來可能像這樣:
WHERE
(job_lvl = 200 OR job_lvl = 300) AND
(hire_date < '01/01/95') OR (status = 'R')
散發與 AND 鏈接的條件之後,子 WHERE 句看起來會像這樣:
WHERE
(job_lvl = 200 AND hire_date < '01/01/95') OR
(job_lvl = 200 AND status = 'R') OR
(job_lvl = 300 AND hire_date < '01/01/95') OR
(job_lvl = 300 AND status = 'R')
如何在 [準則] 窗格中表示多個 AND 和 OR 子句
查詢和檢視設計工具代表您在 [準則] 窗格 (Visual Database Tools) 中的搜尋條件。 不過,在某些情況下,牽涉到與 AND 和 OR連結的多個子句,[準則] 窗格中的表示法可能不是您預期的情況。 此外,如果您在 [準則] 窗格或 [ 圖表] 窗格 (Visual Database Tools) 中修改查詢,您可能會發現您的 SQL 語句已從您輸入的內容變更。
一般而言,這些規則會指定 [準則] 窗格中的 和 AND 子句顯示方式OR:
連結的所有
AND條件都會出現在 [篩選] 方格數據行或相同的 Or... 資料行中。連結的所有
OR條件都會出現在個別 的 Or... 資料行中。如果 和
AND子句組合OR的邏輯結果是AND,會散發成數OR個子句,[準則] 窗格會視需要重複AND子句多次來明確表示此狀況。
例如,在 [SQL] 窗格中,您可能會建立如下的搜尋條件,其中連結的 AND 兩個子句優先於與 OR連結的第三個子句:
WHERE (hire_date < '01/01/95') AND
(job_lvl = 100) OR
(status = 'R')
查詢和檢視表設計工具會在 [準則] 窗格中表示這個 WHERE 子句,如下所示:
不過,如果連結OR子句的優先順序高於 AND 子句,則會針對每個AND子句重複 子OR句。 這會導致子 AND 句散發至每個 OR 子句。 例如,在 [SQL] 窗格中,您可能會建立 WHERE 子句,如下所示:
WHERE (hire_date < '01/01/95') AND
( (job_lvl = 100) OR
(status = 'R') )
查詢和檢視表設計工具會在 [準則] 窗格中表示這個 WHERE 子句,如下所示:
如果連結 OR 子句只牽涉到一個數據行,查詢和檢視表設計工具可以將整個 OR 子句放入方格的單一數據格中,以避免需要重複 AND 子句。 例如,在 [SQL] 窗格中,您可能會建立 WHERE 子句,如下所示:
WHERE (hire_date < '01/01/95') AND
((status = 'R') OR (status = 'A'))
查詢和檢視表設計工具會在 [準則] 窗格中表示這個 WHERE 子句,如下所示:
如果您變更查詢(例如變更 [準則] 窗格中的其中一個值,查詢和檢視表設計工具會在 SQL 窗格中重新建立 SQL 語句。 重新建立的 SQL 語句類似於 [準則] 窗格顯示,而不是原始語句。 例如,如果 [準則] 窗格包含分散式 AND 子句,則會使用明確的分散式 AND 子句重新建立 SQL 窗格中產生的語句。 如需詳細資訊,請參閱本文稍早的 AND 如何與多個 OR 子句搭配使用 。