フィルタ条件を使用すると、クエリー計算を入力行の一部に限定して適用できます。また、クエリーの目的自体が、何らかのフィルタ条件またはいくつかの列の値範囲に基づいて、基本テーブルまたは別のクエリーの結果から一部の行を選択することである場合もあります。それには、フィルタ条件を使用します。_range と _filter の2種類の条件があります。
フィルタ(_filter) | 範囲(_range) |
_filter は任意の条件を表すことができ、より汎用的です。ただし、入力行全体をスキャンし、各行で条件をチェックするため、パフォーマンスが低下します。 | _range は、DataEngine がすべての行をスキャンする必要がない特別なケースのフィルタなので、パフォーマンスに優れています。 |
次のクエリーは、範囲条件を作成する方法を示します。
上のクエリーは、単価が 10 の OrderDetails 行を選択します。クエリーは、DataEngine によって内部的に作成されたインデックスを使用して、目的の行範囲をスキャンし、他の行をチェックすることなく、単価が 10 の行だけを出力するため、この処理はたいへん効率的です。さらに、1つの列に複数の条件演算を適用することもできます。上のクエリーは、"equals" を表す Eq を使用しています。ほかによく使用される演算には、Gte(以上)、Lte(以下)、Gt(より大きい)、Lt(未満)などがあります。列に適用する条件は、次のように組み合わせることができます。
構文 |
コードのコピー
|
---|---|
_range = od.UnitPrice.Gte(10).Lte(20) |
このような「2つの値の間」という条件は _range に適しています。行のスキャンを範囲の先頭から末尾までに制限できるため、やはりパフォーマンスの最適化を図れます。さらに、次のように、複数の列に条件を適用して範囲を指定することもできます。
構文 |
コードのコピー
|
---|---|
_range = od.Discount.Eq(0) + od.UnitPrice.Gte(10).Lte(20) |
_range として指定できない条件もあります。 たとえば、"not equal"(Ne)条件は範囲で使用できません。このため、Ne 条件を使用するには、次のように _filter を適用する必要があります。
構文 |
コードのコピー
|
---|---|
_filter = od.Discount.Ne(0) |
DataEngine の条件は、AND だけでなく、OR とも組み合わせることができます。ただし、OR は、次のようにフィルタでのみ使用できます。
構文 |
コードのコピー
|
---|---|
_filter = od.UnitPrice.Lt(10).Or().Gt(20) |
And() 演算もあり、次のように、1つのフィルタで OR と AND を組み合わせることができます。
構文 |
コードのコピー
|
---|---|
_filter = od.UnitPrice.Lt(10).Or().Gt(20).And().Lt(30) |
上のクエリーは、10 未満または 20 と 30 の間を意味します。
任意の数の Or() と And() を使用し、次のように、+ と組み合わせて複数の列に条件を適用できます。
構文 |
コードのコピー
|
---|---|
_filter = od.Discount.Ne(0) + od.UnitPrice.Lt(10).Or().Gt(20).Or().Gt(30) |