レベル内で処理するために (
For Each コマンドまたは
データプロバイダーのグループステートメント)、データが満たす必要のある条件のリストを指定します。この条件にはブール式、簡単な式、または非常に複雑なネストされた式を指定できます。
複数の Where 節を指定できます。この場合、条件は
And 演算子で区切られている場合と同様に評価します。
| {where |
{<condition> [ when <constraint> ] } | |
| |
{ [ not ] <attribute> in <DataSelectorName>( [ <parameterList> ] ) }}... |
入力値の説明:
<condition>
データの取り出しに条件を付ける有効な論理エクスプレッションを指定します。「and」、「or」、「not」の論理演算子を使用した複合条件にすることもできます。
この条件で指定する項目属性は、For Each の
ベーステーブルとその
拡張テーブルのどちらにあるものでもかまいません。場合によっては、拡張テーブルに属さない項目属性が含まれることがあります。詳細は、「
ヒントとしてのフィルタ」を参照してください。
n 回目の where 節の出現は、連続するブール条件を持つ where 節が 1 つしか出現しない場合と同じです。
<condition> ::=
|
[ not ] <condition> [ {or | and} <condition> ] |
| |
[ ( ] <condition> [ ) ] |
| |
<relationalExpr> |
| |
<stringExpr> like <stringExpr> |
| |
<booleanFunctionExpr> |
<relationalExpr> ::=
|
<expr> [ {> | >= | = | < | <=} <expr> ] |
| |
<expr> はエクスプレッションです。比較に使用する場合は、比較できるようなデータタイプでなければなりません (つまり、Numeric や Character など)。また、集計式 (インライン) (つまり、count、sum、min、max、average) でもかまいません。
|
<booleanFunctionExpr> ::=
|
True | False | <bool_attribute> | <bool_variable> | <bool_function>( <expr> ) | <bool_proc>}( [ <parametersList> ] ) |
| |
<bool_attribute>、<bool_variable> は、それぞれ Boolean データタイプの項目属性と変数です。
<bool_fuction> は、ブール値の結果 (True または False) を返す関数です。<expr> は、<bool_function> で必要とされるデータタイプのエクスプレッションです。
<bool_proc> は、ブール値を返すユーザー定義のプロシージャーです。
|
<constraint>
Where 節をいつ適用するかを指定する
<condition> です。クライアント/サーバープラットフォームでは、まず、各 Where 節の
When 節が評価され、条件が満たされた場合は、Where 節で指定したフィルタが適用されます。詳細については、「
When 節」を参照してください。
[
not ]
<attribute> in <DataSelectorName>( [
<parameterList> ] )
クエリを決定するのは、
Data Selector オブジェクト自体です。したがって、データセレクターの定義で生成される SELECT 文は、レベル 1 (
For Each コマンドまたは
データプロバイダーのグループステートメント) の SELECT 文とは異なる独立したものになります。このため、
<attribute> と同じ定義に対応する値のコレクションを返します。<attribute> は、データセレクターのベーステーブルの拡張テーブルに属している必要があります。詳細については、次の記事を参照してください:
For Each コマンドにおけるデータセレクター。
構文が多少異なる (たとえば、'where' キーワードがないなど) ものの同じコンセプトが
Data Selector、および
Web Panel、
Panel オブジェクト、
Work With パターンと Work With オブジェクトの [ 条件 ] エレメント、さらにグリッドの [ Conditions ] プロパティに適用されます。
Where 節の
<Condition> は、取得されるデータセットを制限します。ただし、それだけではありません。フル スキャン テーブル アクセスとインデックスで最適化されたランダムアクセスには大きな違いがあります。一定の論理ルールを適用する場合、GeneXus は order 節 (あるいは主キーの順序) が、where 条件と互換性があると判断します。フル テーブル スキャンを行わず、インデックスを使い、テーブルへのアクセスを最適化します。これは、どのような場合にも望ましい動作です。
次の演算子を使用する条件を最適化できます: >、>=、=、<、および <=。
Where 条件を最適化すると、ナビゲーションレポートで [ Navigation Filter ] として表示されます。最適化しない場合は [ Constraint ] として表示されます。
Where 節で使用する条件がタイプの定義に必ず準拠するようにしてください。準拠しない場合は、タイプのミスマッチを示すエラーメッセージが表示されます。
詳細については、「
条件付きフィルタと順序」を参照してください。
1. 特定の日付以降に特定の国で生まれた顧客の名前を印刷する必要があるとします。
For each Customer
Where CountryId = &CountryId
Where CustomerBirthDate.year() >= &youngDate
print youngCustomer //printblock with: CustomerName
EndFor
なお、このコードは、ベーステーブルを指定するための
ベーストランザクション節が取り込まれた
GeneXus X Evolution 3 以降でのみ有効です。ただし、この節は必須ではなく、使用しなくてもかまいません。この場合、以前のバージョンの GeneXus でもこのコードは有効になります。
CountryId、CustomerBirthDate、および CustomerName は CUSTOMER 拡張テーブルに属します。
order は指定されていません。これにより、「
条件付きフィルタと順序」で説明したように、パフォーマンスに影響が生じます。
2. 次に、&CountryId は、たとえば Web パネルなどにより、エンドユーザーが設定するものとします。ユーザーが変数を空のままにしておくことがあるので、その場合はフィルタを適用しないようにする必要があります:
for each Customer
where CountryId = &CountryId when not &CountryId.lsEmpty()
where CustomerBirthDate.year() >= &youngDate
print youngCustomer // printblock with: CustomerName
endfor
3. 複数のオブジェクトで特定の国の若い顧客をフィルタする必要がある場合、そのクエリを定義するために、データセレクターを作成している可能性があります:

そのため、以前の for each は次のようになります:
for each Customer
where CustomerId in YoungCustomer( &CountryId, &youngDate )
print youngCustomer // printblock with: CustomerName
endfor
4. 最後に、顧客が 100 人以上いる国を印刷します:
for each Country
where Count( CustomerName ) > 100
print countryInfo //printblock with: CountryName
endfor
この場合、for each のベーステーブルは COUNTRY になります。
コマンド: For Each コマンド、
Xfor Each コマンド、
Xfor First コマンド、
データプロバイダーのグループステートメント
条件付きフィルタと順序