次の方法で共有


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 と同等です。

これらのリンク タイプをフィルター要素の中で使用する場合、これらのフィルターは、親 filtertype 属性で定義された動作に従う子条件となります。

これらの型を使用するフィルターは、一致する行がリンク エンティティに複数存在する場合でも、親行 を最大 1 回返します。 リンク エンティティの行から列の値を返すことはできません。

次の例は、関連レコードの値に対するフィルターを示しています。 これらの例には、動作の説明に役立つ同等の SQL 文が含まれています。

このクエリは、タイプ orfilter とタイプ any の子 link-entity を使用して、連絡先のレコードを返します:

<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>

このクエリは、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>

注意

allnot 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>

このクエリは 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 分かかります。 個人データは収集されません (プライバシー ステートメント)。