Filter、Search、および LookUp 関数
適用対象: キャンバス アプリ デスクトップ フロー モデル駆動型アプリ Power Pages Power Platform CLI
フィルター、**検索、および 検索 機能の使い方については、このビデオをご覧ください。
注意
PAC CLI pac power-fxコマンド は 検索 機能をサポートしていません。
説明
Filter 関数は、数式を満たすテーブルでのレコードを検索します。 1 つ以上の条件に一致する一連のレコードを検索したり、条件に一致しないレコードを破棄したりするには、フィルター を使用します。
LookUp 関数は、数式を満たすテーブルでの最初のレコードを検索します。 LookUp を使用して 1 つ以上の条件に一致する単一レコードを検索します。
どちらの場合も、数式はテーブルの各レコードに対して評価されます。 結果が true であるレコードは、結果に含まれます。 標準的な数式の 演算子に加えて、サブストリング照合には in および exactin 演算子を使用できます。
現在処理されているレコードのフィールドは、この数式内で使用できます。 ThisRecord 演算子を使用するか、他の値を参照するのと同様に名前でフィールドを参照します。 As 演算子を使用して処理対象のレコードを指定することもできます。そうすると数式がわかりやすくなり、入れ子になったレコードにアクセスしやすくなります。 詳細については、以下の例と「レコードのスコープに関する作業」を参照してください。
Search 関数は、いずれかの列に文字列を含むテーブルのレコードを検索します。 この文字列は、列内のどこに現れてもかまいません。たとえば、"rob" または "bert" を検索すると、"Robert" を含む列で一致が検出されます。 検索では大文字と小文字を区別しません。 Filter および LookUp とは異なり、Search 関数は、数式の代わりに一致する単一文字列を使用します。
フィルター と 検索 は、元のテーブルと同じ列と条件に一致するレコードを含むテーブルを返します。 LookUp は、レコードを単一の値に減らす数式を適用した後、見つかった最初のレコードのみを返します。 レコードが見つからない場合、Filter および Search は空 のテーブルを返し、LookUp は空白を返します。
テーブルは、文字列や数値と同じように、 内の値です Power Apps。 関数に渡して、関数から返すことができます。 Filter、 Search、および LookUp ではテーブルは変更されません。 代わりに、引数としてテーブルを受け取り、そこからテーブル、レコード、または単一の値を返します。 詳細については、テーブルの使用 に関するページを参照してください。
委任
可能な場合、Power Apps はオンデマンドの結果を通じてフィルター操作と並べ替え操作をデータ ソースやページに委任します。 たとえば、データが入力されたギャラリー コントロールを表示するアプリを起動すると、最初はレコードの最初のセットのみがデバイスに表示されます。 ユーザーがスクロールすると、追加のデータがデータ ソースから引き出されます。 その結果、アプリの起動が高速になり、大規模なデータ セットにアクセスできます。
ただし、常に委任できるとは限りません。 データ ソースによって、委任がサポートされる関数や演算子が異なります。 数式を完全には委任できない場合、作成環境は委任できない部分を警告でフラグします。 可能であれば、委任できない関数や演算子を使用しないよう、数式を変更することを検討してください。 委任一覧は、委任できるデータ ソースや操作の詳細を示します。
委任できない場合、Power Apps はローカルで作業するために少量のレコードのセットのみを引き出します。 フィルター関数と並べ替え関数は、削減されたセットのレコードで機能します。 ギャラリーで入手できるものは完全なストーリーでない場合があり、ユーザーの混乱を招くことがあります。
詳しくは、「委任の概要」を参照してください。
構文
フィルター(表*, 式1 [, *式2*, ... ] )
- 表 - 必須。 検索するテーブル。
- 数式 - 必須。 テーブルの各レコードが評価される数式。 関数は、結果が true のすべてのレコードを返します。 テーブル内の列を参照することができます。 複数の数式を指定した場合、すべての数式の結果は And 関数を使用して組み合わせられます。
検索(テーブル*、 検索文字列、 列1 [、*列2*、...])
- 表 - 必須。 検索するテーブル。
- SearchString - 必須。 検索のための文字列。 空白または空の文字列の場合は、すべてのレコードが返されます。
- 列 - 必須。 検索する Table 内の列の名前。 SearchString が、これらの列のいずれかのデータ内で部分一致として見つかった場合、レコード全体が返されます。
注意
バージョン 3.24042 より前の Power Apps では、検索 機能の列名は二重引用符を使用したテキスト文字列で指定され、データ ソースに接続されている場合は論理名である必要がありました。 たとえば、引用符のない表示名 名前 の代わりに、二重引用符で囲まれた論理名 "cr43e_name" が使用されました。 SharePoint およびスペースを含む列名を含む Excel データ ソースの場合、各スペースは "_x0020_" で指定されます。たとえば、"列名" は "Column_x0020_Name" となります。 このバージョン以降、すべてのアプリはこの記事で説明されている新しい構文に自動的に更新されました。
LookUp(テーブル*, 式 [, ReductionFormula ] )
- 表 - 必須。 検索するテーブル。 UI で、構文が関数ボックスの上に ソース として表示されます。
- 式 - 必須。 テーブルの各レコードが評価される数式。 関数は結果が true の最初のレコードを返します。 テーブル内の列を参照することができます。 UI で、構文が関数ボックスの上に条件として表示されます。
- ReductionFormula - オプション。 この数式は、検出されたレコードに対して評価し、次にレコードを単一の値に減らします。 テーブル内の列を参照することができます。 このパラメーターを使用しない場合、関数はテーブルからレコード全体を返します。 UI で、構文が関数ボックスの上に結果として表示されます。
使用例
次の例では、 IceCreamデータ ソース を使用します:
式 | Description | Result |
---|---|---|
フィルター(IceCream、OnOrder > 0) | OnOrder が 0 より大きいレコードを返します。 | |
フィルター(アイスクリーム、数量 + OnOrder > 225) | 数量および OnOrder 列の合計が 225 より大きいレコードを返します。 | |
フィルター(アイスクリーム、下段(フレーバー)に「チョコレート」) | 大文字または小文字に関係なく、Flavor の名前に "chocolate" という単語が表示されるレコードを返します。 | |
フィルター(アイスクリーム、数量 < 10 && OnOrder < 20) | 数量が 10 未満および OnOrder が 20 未満のレコードを返します。 これらの条件に一致するレコードがないため、空のテーブルが返されます。 | |
検索(アイスクリーム、"チョコ"、フレーバー) | 大文字または小文字に関係なく、Flavor の名前に "choc" という文字列が表示されるレコードを返します。 | |
検索(アイスクリーム, "", フレーバー) | 検索語句が空であるため、すべてのレコードが返されます。 | |
LookUp(アイスクリーム、フレーバー = "チョコレート"、数量) | Flavor が "Chocolate" に等しいレコードを検索します (その中で 1 つあります)。 見つかった最初のレコードについて、そのレコードの数量を返します。 | 100 |
LookUp(アイスクリーム、数量 > 150、数量 + 注文時) | Quantity が 150 を超えるレコードを検索し、その中でそれは複数あります。 見つかった最初のレコード 、"Vanilla" の Flavor に関して、数量および OnOrder 列の合計を返します。 | 250 |
LookUp(アイスクリーム、フレーバー = "ピスタチオ"、OnOrder) | Flavor が "Pistachio" に等しいレコードを検索し、その中にそれは存在しません。 見つからなかったため、検索 は空白を返します。 | 空白 |
LookUp(アイスクリーム、フレーバー = "バニラ") | Flavor が "Vanilla" に等しいレコードを検索します (その中で 1 つあります)。 換算公式が指定されなかったため、レコード全体が返されます。 | { Flavor: "Vanilla", Quantity: 200, OnOrder: 75 } |
選択列でフィルタリング
次の例では、データ ソースとして Microsoft Dataverse の取引先企業テーブルを使用します。 この例は、選択した Combo box コントロール値に基づいてアカウントのリストを フィルター する方法を示しています:
手順
空のアプリを開くきます。
新しい画面オプションを選択して新しい画面を追加します。
挿入タブで、Galleryを選択してから、縦を選択します。
右側のウィンドウのプロパティ タブで、データ ソースを開き、次に取引先企業を選択します。
(オプション) レイアウト リストで、さまざまなオプションを選択します。
挿入タブで、入力を選択してから、Combo box を選択します。 この手順を繰り返して、さらに 2 つのコンボ ボックス コントロールを追加します。
コンボ ボックス コントロールごとに、右側のウィンドウのプロパティ タブで、データ ソースを開き、次に取引先企業を選択します。 フィールド オプションの隣の編集を選択してから、プライマリ テキストおよび SearchField 値を選択します。 プライマリ テキストはコンボ ボックスに追加する選択列である必要があります。 他の 2 つのコンボ ボックス コントロールについても、この手順を繰り返します。
次に、Gallery コントロールを選択し、Itemsプロパティを次の数式に設定します。
Filter(Accounts, 'Industry' = ComboBox3.Selected.Industry Or IsBlank(ComboBox3.Selected.Industry), 'Relationship Type' = ComboBox2.Selected.'Relationship Type' Or IsBlank(ComboBox2.Selected.'Relationship Type'), 'Preferred Method of Contact' = ComboBox1.Selected.'Preferred Method of Contact' Or IsBlank(ComboBox1.Selected.'Preferred Method of Contact'))
検索のユーザー エクスペリエンス
次の例では、 IceCreamデータ ソース を使用します:
多くのアプリでは、検索ボックスに 1 つ以上の文字を入力して、大きなデータ セット内のレコードの一覧をフィルター処理することができます。 入力すると、一覧には、検索条件に一致するレコードのみが表示されます。
この記事の残りにある例では、Customers という一覧を検索した場合の結果を示しています。この一覧には、次のデータが含まれています。
このデータ ソースをコレクションとして作成するには、Button コントロールを作成し、その OnSelect プロパティを次の数式に設定します。
ClearCollect(顧客、テーブル({ 名前: "Fred Garcia"、会社: "Northwind Traders" }、 { 名前: "Cole Miller"、会社: "Contoso" }、 { 名前: "Glenda Johnson"、会社: "Contoso" }、 { 名前: "Mike Collins"、会社: "Adventure Works" }、 { 名前: "Colleen Jones"、会社: "Adventure Works" }) )
この例に示すように、画面下部にあるギャラリー コントロールにレコードの一覧を表示できます。 画面の上部には、ユーザーが関心のあるレコードを指定できるように、SearchInput という名前のText input コントロールを追加できます。
ユーザーが SearchInput に文字を入力すると、ギャラリーの結果は自動的にフィルター処理されます。 この場合、ギャラリーは、(会社の名前ではなく) 顧客の名前が SearchInput の文字シーケンスで始まるレコードを表示するように構成されています。 ユーザーが検索ボックスに co と入力する場合、ギャラリーには次の結果が表示されます。
Name 列に基づいてフィルター処理するには、ギャラリー コントロールの Items プロパティを次の数式のいずれかに設定します。
計算式 | 内容 | 結果 |
---|---|---|
フィルター(顧客、StartsWith(名前、SearchInput.Text)) | Customers データ ソースで、検索文字列が Name 列の先頭に出現するレコードをフィルター処理します。 このテストでは、大文字と小文字が区別されません。 ユーザーが検索ボックスに co と入力した場合、ギャラリーには、Colleen Jones と Cole Miller が表示されます。 ギャラリーに Mike Collins が表示されないのは、そのレコードの Name 列の先頭に検索文字列がないためです。 | |
フィルター(顧客、名前内のSearchInput.Text) | Customers データ ソースで、検索文字列が Name 列のどこかに出現するレコードをフィルター処理します。 このテストでは、大文字と小文字が区別されません。 ユーザーが検索ボックスに co と入力した場合、ギャラリーには、Colleen Jones、Cole Miller、Mike Collins が表示されます。これは、検索文字列が、これらすべてのレコードの Name 列のどこかに出現しているためです。 | |
検索(顧客、検索入力テキスト、名前) | in 演算子を使用した場合と同様、Search 関数は、各レコードの Name 列内で一致を検索します。 列名を二重引用符で囲む必要があります。 |
会社列および名前列を含めるように検索範囲を広げることができます。
式 | 説明 | 結果 |
---|---|---|
フィルター(顧客、StartsWith(名前、SearchInput.Text) || StartsWith(会社、SearchInput.Text) ) | Customers データ ソースで、Name 列または Company 列の先頭に検索文字列 (たとえば、co) があるレコードをフィルター処理します。 どちらか一方の StartsWith 関数が true の場合、|| 演算子 は true になります。 | |
フィルター(顧客、SearchInput.名前のテキスト || SearchInput.会社内のテキスト) | Customers データ ソースで、Name 列または Company 列の中に検索文字列 (たとえば、co) が含まれているレコードをフィルター処理します。 | |
検索(顧客、検索入力テキスト、名前、会社) | in 演算子を使用した場合と同様、Search 関数は、Customers データ ソースで、Name 列または Company 列の中に検索文字列 (たとえば、co) が含まれているレコードを検索します。 複数の列と複数の in 演算子を指定する場合は、Filter よりも Search 関数の方が読み書きが簡単です。 |