適用対象:SQL Server
任意の数の AND 演算子および OR 演算子とリンクされた任意の数の検索条件を含むクエリを作成できます。 AND 句と OR 句を組み合わせたクエリは複雑になる可能性があるため、クエリの実行時にこのようなクエリがどのように解釈されるか、およびこのようなクエリが 抽出条件ペイン および SQL ペイン でどのように表されるかを理解すると便利です。
手記
1 つの AND 演算子または OR 演算子のみを含む検索条件の詳細については、「1 つの列に複数の検索条件を指定する (Visual Database Tools)」および「複数列の複数の検索条件を指定する (Visual Database Tools)を参照してください。
以下に関する情報を示します。
両方を含むクエリでの AND と OR の優先順位。
AND 句と OR 句の条件が論理的にどのように相互に関連しているか。
クエリおよびビュー デザイナーが、AND と OR の両方を含む抽出条件ペインのクエリをどのように表すか。
以下の説明を理解するために、employee
、hire_date
、および job_lvl
の列を含む status
テーブルを使用しているとします。 この例では、従業員が会社に勤務した期間 (つまり、従業員の雇用日)、従業員が実行するジョブの種類 (ジョブ レベル)、従業員の状態 (退職など) などの情報を把握する必要があることを前提としています。
AND と OR の優先順位
クエリを実行すると、最初に AND にリンクされた句が評価され、次に OR でリンクされた句が評価されます。
手記
NOT 演算子は、AND と OR の両方よりも優先されます。
たとえば、低レベルの仕事で 5 年以上会社に勤務している従業員、または採用日に関係なく中レベルのジョブを持つ従業員を見つけるには、次のような WHERE 句を作成できます。
WHERE
hire_date < '01/01/95' AND
job_lvl = 100 OR
job_lvl = 200
OR よりも AND の既定の優先順位をオーバーライドするには、SQL ペインの特定の条件をかっこで囲みます。 かっこ内の条件は常に最初に評価されます。 たとえば、下位または中レベルのジョブで 5 年以上会社に勤務しているすべての従業員を検索するには、次のような WHERE 句を作成できます。
WHERE
hire_date < '01/01/95' AND
(job_lvl = 100 OR job_lvl = 200)
ヒント
わかりやすくするために、既定の優先順位に依存するのではなく、AND 句と OR 句を組み合わせる場合は常にかっこを含めておくことをお勧めします。
複数の OR 句での AND の動作
AND 句と OR 句を組み合わせたときにどのように関連するかを理解すると、クエリおよびビュー デザイナーで複雑なクエリを構築し、理解するのに役立ちます。
AND を使用して複数の条件をリンクする場合、AND にリンクされている最初の条件セットは、2 番目のセットのすべての条件に適用されます。 つまり、AND と別の条件にリンクされた条件は、2 番目のセット内のすべての条件に分散されます。 たとえば、次のスケマティック 表現は、一連の OR 条件にリンクされた AND 条件を示しています。
A AND (B OR C)
上記の表現は、AND 条件が 2 番目の条件セットにどのように分散されるかを示す、次のスケマティック表現と論理的に等価です。
(A AND B) OR (A AND C)
この再頒布原則は、クエリおよびビュー デザイナーの使用方法に影響します。 たとえば、下位または中レベルのジョブで 5 年以上会社に勤務しているすべての従業員を探しているとします。 SQL ペインのステートメントに次の WHERE 句を入力します。
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100 OR job_lvl = 200)
AND でリンクされた句は、OR でリンクされている両方の句に適用されます。 これを明示的に表す方法は、OR 句の条件ごとに AND 条件を 1 回繰り返す方法です。 次のステートメントは、前のステートメントよりも明示的 (および長い) ですが、論理的には同等です。
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100) OR
(hire_date < '01/01/95' ) AND
(job_lvl = 200)
リンクされた OR 句に AND 句を配布する原則は、関係する個々の条件の数に関係なく適用されます。 たとえば、会社に 5 年以上勤務している、または退職した上位または中レベルの従業員を見つけるとします。 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 句を表す方法
クエリおよびビュー デザイナーは、抽出条件ペインの検索条件を表します。 ただし、AND と OR にリンクされた複数の句が含まれる場合は、抽出条件ペインの表現が想定とは一致しない場合があります。 さらに、抽出条件ペインまたは ダイアグラム ペインでクエリを変更すると、SQL ステートメントが入力した内容から変更されている場合があります。
一般に、次の規則によって、抽出条件ペインに AND 句と OR 句がどのように表示されるかが決まります。
AND と結びついているすべての条件が、フィルター グリッド列または同じ Or... 列に表示されます。
OR にリンクされているすべての条件は、個別の Or... の列に表示されます。
AND 句と OR 句の組み合わせの論理的な結果が、AND が複数の OR 句に分散されている場合、抽出条件ペインでは、AND 句を必要な回数繰り返すことで明示的にこれを表します。
たとえば、SQL ペインで次のような検索条件を作成し、AND でリンクされた 2 つの句が OR にリンクされた 3 番目の句よりも優先されます。
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100) OR
(status = 'R')
クエリおよびビュー デザイナーは、抽出条件ペインで次の WHERE 句を表します。
ただし、リンクされた OR 句が AND 句よりも優先される場合は、OR 句ごとに AND 句が繰り返されます。 これにより、AND 句が各 OR 句に配布されます。 たとえば、SQL ペインで、次のような WHERE 句を作成できます。
WHERE (hire_date < '01/01/95' ) AND
( (job_lvl = 100) OR
(status = 'R') )
クエリおよびビュー デザイナーは、抽出条件ペインで次の WHERE 句を表します。
リンクされた OR 句に含まれるデータ列が 1 つだけの場合、クエリおよびビュー デザイナーでは、OR 句全体をグリッドの 1 つのセルに配置できるため、AND 句を繰り返す必要がなくなります。 たとえば、SQL ペインで、次のような WHERE 句を作成できます。
WHERE (hire_date < '01/01/95' ) AND
((status = 'R') OR (status = 'A'))
クエリおよびビュー デザイナーは、抽出条件ペインで次の WHERE 句を表します。
抽出条件ペインで定義されたリンクされた OR 句
クエリに変更を加えた場合 (抽出条件ペインの値の 1 つを変更するなど)、クエリおよびビュー デザイナーによって SQL ペインに SQL ステートメントが再作成されます。 再作成された SQL ステートメントは、元のステートメントではなく抽出条件ペインの表示に似ています。 たとえば、抽出条件ペインに分散 AND 句が含まれている場合、SQL ペインの結果のステートメントは明示的な分散 AND 句で再作成されます。 詳細については、このトピックの「複数の OR 句での AND の動作」を参照してください。