FetchXML を使用して行をフィルターする
返すデータ行の条件を設定するには、エンティティ、リンク エンティティ、または別の filter
要素の中でフィルター要素を使用します。
条件を設定するには、フィルターに 1 つ以上の条件要素を追加します。 含む filter``type
属性は、条件の 全て (and
) か いずれか (or
) のどちらを満たさなければならないかを決定します。 既定値は and
です。 フィルター要素を入れ子にすることで、and
または or
で評価される基準を組み合わせた複雑なフィルター基準を作成することができます。
各 condition
には、行の列の値を評価する operator
属性があります。 条件演算子の値はたくさんあります。
たとえば、以下のクエリは address1_city
が 「Redmond」 に等しいアカウント レコードを返します。 <filter type='and'>
と eq 演算子 を使用します。
<fetch>
<entity name='account'>
<attribute name='name' />
<filter type='and'>
<condition attribute='address1_city'
operator='eq'
value='Redmond' />
</filter>
</entity>
</fetch>
このクエリは address1_city
が 「Redmond」、「Seattle」、または「Bellevue」 に等しいアカウント レコードを返します。 これは、それぞれ eq 演算子を使用する 3 つの条件要素を持つ <filter type='or'>
を使用します。
<fetch>
<entity name='account'>
<attribute name='name' />
<attribute name='address1_city' />
<filter type='or'>
<condition attribute='address1_city'
operator='eq'
value='Redmond' />
<condition attribute='address1_city'
operator='eq'
value='Seattle' />
<condition attribute='address1_city'
operator='eq'
value='Bellevue' />
</filter>
</entity>
</fetch>
先ほどのクエリーは、in 演算子を使って condition
要素 1 つで表すこともできます。 この条件には、address1_city
と比較する値を指定するための複数の値要素が含まれています。
<fetch>
<entity name='account'>
<attribute name='name' />
<attribute name='address1_city' />
<filter type='and'>
<condition attribute='address1_city'
operator='in'>
<value>Redmond</value>
<value>Seattle</value>
<value>Bellevue</value>
</condition>
</filter>
</entity>
</fetch>
演算子パラメーター
演算子には、パラメーターを必要としないもの、単一のパラメーターを必要とするもの、複数のパラメーターを必要とするものがあります。 演算子は、評価する値をどのように設定するかを決定します。
パラメーターがない
いくつかの演算子はパラメータを必要としません。 たとえば、eq-userid 演算子を使用して、一意の識別子を評価し、それが呼び出し元のユーザー ID と一致するかどうかを判断することができます。
<condition attribute='ownerid'
operator='eq-userid' />
単体のパラメーター
演算子が単一のパラメータを必要とする場合、value
属性を使用して評価する値を設定します。
たとえば、eq 演算子を使って、value
属性を設定したレコードの statecode
選択肢列の値を評価することができます。
<condition attribute='statecode'
operator='eq'
value='0' />
複数のパラメーター
演算子に複数のパラメーターが必要な場合は、値要素を使用して評価する値を指定します。 たとえば、between 演算子を使って数値を評価し、それが一連の値の間にあるかどうかを判断できます。
<condition attribute="numberofemployees"
operator="between">
<value>6</value>
<value>20</value>
</condition>
フィルターまたはリンク エンティティ
リンク エンティティ内でフィルターを適用すると、結合後にフィルタが適用されるように設定しない限り、結合と同時にフィルタが適用されます。
リンク エンティティ link-type
属性値が outer
の場合、条件 entityname
属性値を設定することで、結合後にフィルターを適用することができます。 リンク エンティティ alias
を使用している場合、alias
の値を使って entityname
属性を設定します。 そうでない場合は、entityname
属性値を リンク エンティティ name
の属性値に設定します。
たとえば、次のクエリは、親会社なしの取引先担当者か、ファックス なしの親会社を返します。
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<filter>
<condition entityname='a'
attribute='fax'
operator='null' />
</filter>
<link-entity name='account'
from='accountid'
to='parentcustomerid'
link-type='outer'
alias='a' />
</entity>
</fetch>
同じ行の列値に対するフィルター
valueof
属性を使って、同じ行の値の列を比較するフィルターを作成することができます。 たとえば、列 firstname
の値が列 lastname
の値と一致する連絡先レコードを検索したい場合は、以下のクエリを使用します:
<fetch>
<entity name='contact' >
<attribute name='firstname' />
<filter>
<condition attribute='firstname'
operator='eq'
valueof='lastname' />
</filter>
</entity>
</fetch>
テーブル間にまたがる列の比較
FetchXML のみの場合、関連テーブルのフィールド値のみを比較できます。 次の例では、contact fullname
列が account name
列と一致する行を返します。
<fetch>
<entity name='contact'>
<attribute name='contactid' />
<attribute name='fullname' />
<filter type='and'>
<condition attribute='fullname'
operator='eq'
valueof='acct.name' />
</filter>
<link-entity name='account'
from='accountid'
to='parentcustomerid'
link-type='outer'
alias='acct'>
<attribute name='name' />
</link-entity>
</entity>
</fetch>
リンク エンティティ要素<は alias
属性を使用し、valueof
パラメーターの値は関連するテーブルのエイリアスとカラム名を参照する必要があります。
列比較フィルタの制限
この種のフィルターには制限があります:
-
Operator Description eq 値が等しいかどうかが比較されます。 ne 2 つの値は等しくありません。 gt 値が比較する値より大きい。 ge 値が比較値以上である必要があります。 lt 値が比較する値より小さい。 le 値が比較値以下である必要があります。 一度に比較できるのは 2 つの列だけです
拡張条件操作はサポートされていません。 例:
valueof='amount'+ 100
列は同じ型でなければなりません。 例: 文字列の値と数値の値を比較することはできません。
関連レコードの値でフィルターする
関連するレコードの値を返さずにフィルターするには、フィルター要素内で以下の link-type
属性のいずれかを持つリンクエンティティ要素を使用します:
件名 | 説明 |
---|---|
any |
これを フィルター要素内で使用します。 結果を、リンクされたエンティティ内の一致する行を持つ親行に制限します。 |
not any |
これを フィルター要素内で使用します。 リンクされたエンティティに一致する行がない親行に結果を制限します。 |
all |
これを フィルター要素内で使用します。 from 列の値が一致する行がリンク エンティティに存在するが、それらの一致する行のすべてがこのリンク エンティティに定義された追加フィルタを満たさない場合に、結果を親行に制限します。 追加フィルタを反転して、一致するリンク エンティティ行がすべて追加条件を満たす親行を見つける必要があります。 |
not all |
これを フィルター要素内で使用します。 結果を、リンクされたエンティティ内の一致する行を持つ親行に制限します。 このリンク タイプは、名前を問わず、any と同等です。 |
これらのリンク タイプをフィルター要素の中で使用する場合、これらのフィルターは、親 filter
の type
属性で定義された動作に従う子条件となります。
これらの型を使用するフィルターは、一致する行がリンク エンティティに複数存在する場合でも、親行 を最大 1 回返します。 リンク エンティティの行から列の値を返すことはできません。
関連レコードの値に対するフィルターの例
次の例は、関連レコードの値に対するフィルターを示しています。 これらの例には、動作の説明に役立つ同等の SQL 文が含まれています。
または link-type
any
でフィルターします
このクエリは、タイプ or
の filter
とタイプ any
の子 link-entity
を使用して、連絡先のレコードを返します:
- _いずれか_が、Name 列が 「Contoso」 に等しい少なくとも 1 つのアカウントレコードの PrimaryContactId ルックアップ列によって参照されます。
- _また_は、Contact.StateCode ピックリストの列 を 1 : Inactive に設定してください:
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<filter type='or'>
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='any'>
<filter type='and'>
<condition attribute='name'
operator='eq'
value='Contoso' />
</filter>
</link-entity>
<condition attribute='statecode'
operator='eq'
value='1' />
</filter>
</entity>
</fetch>
link-type
not any
このクエリは、not any
リンク タイプを使用して、Name 列が 「Contoso」 に等しいアカウント レコードの PrimaryContactId ルックアップ列によって参照されない連絡先テーブルのレコードを返します。 連絡先_レコードは、他の_Name 列_値を持つ_アカウント レコードから参照される可能性があります。
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<filter type='and'>
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='not any'>
<filter type='and'>
<condition attribute='name'
operator='eq'
value='Contoso' />
</filter>
</link-entity>
</filter>
</entity>
</fetch>
link-type
not all
注意
all
と not all
のリンク タイプは、その名前から想像される意味とは正反対で、通常、反転フィルターとともに使用されます:
- タイプ
not all
のリンク エンティティはany
と等価で、フィルターに一致するリンク エンティティ レコードを持つ親レコードを返します。 all
型のリンク エンティティは、一致するfrom
列の値を持つリンク エンティティ レコードが存在するが、それらのリンク エンティティ行の中に リンク エンティティ要素の内部で定義された追加フィルタを満たすものがない場合に、親レコードを返します。
このクエリは、not all
型 の link-entity
を使用して、Name 列が「Contoso」に等しい、少なくとも 1 つのアカウント レコードのPrimaryContactId ルックアップ列によって参照されるレコードを 連絡先 テーブルから返します:
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<filter type='and'>
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='not all'>
<filter type='and'>
<condition attribute='name'
operator='eq'
value='Contoso' />
</filter>
</link-entity>
</filter>
</entity>
</fetch>
link-type
all
このクエリは all
型の link-entity
を使用して、連絡先テーブルから、 一部アカウント レコードの PrimaryContactId ルックアップ列によって参照されるレコードを返します。しかし、これらの_アカウント_ レコードのうち、Name 列が 「Contoso」 に等しいものはありません:
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<filter type='and'>
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='all'>
<filter type='and'>
<condition attribute='name'
operator='eq'
value='Contoso' />
</filter>
</link-entity>
</filter>
</entity>
</fetch>
条件の制限
FetchXml クエリに含めることができる条件およびリンク エンティティ要素は、合計 500 個までです。 それ以外の場合はこのエラーが表示されます:
名前:
TooManyConditionsInQuery
コード:0x8004430C
番号:-2147204340
メッセージ:Number of conditions in query exceeded maximum limit.
クエリを実行するための条件数を減らす必要があります。 数字、一意識別子、850 文字までの文字列で使える in演算子 を使えば、条件の数を減らせるかもしれません。
次の手順
結果を表示する方法をご覧ください。
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。