Filter、Search 和 LookUp 函数
Filter、Search 和 LookUp 函数
Filter、Search 和 LookUp 函数
适用于:
- 画布应用
- 桌面流
- 模型驱动应用
- Power Pages
- Power Platform CLI
查找表中的一个或多个记录。
观看此视频,了解如何使用Filter、Search 和 LookUp 函数:
备注
PAC CLI pac power-fx 命令不支持搜索功能。
描述
Filter 函数查找表中满足公式的记录。 使用 Filter 可查找匹配一个或多个条件的一组记录并丢弃不匹配的记录。
LookUp 函数查找表中满足公式的第一条记录。 使用 LookUp 可查找匹配一个或多个条件的单个记录。
对于这两者,系统都会针对表的每条记录计算公式。 结果为 true 的记录将包含在结果中。 除常规公式运算符外,还可对子字符串匹配项使用 in 和 exactin 运算符。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
Search 函数在表中查找其某个列中包含某个字符串的记录。 字符串可能出现在列中的任何位置;例如,搜索“rob”或“bert”会在包含“Robert”的列中找到匹配项。 搜索不区分大小写。 与 Filter 和 LookUp 不同,Search 函数使用单个字符串而非公式进行匹配。
Filter 和 Search 返回一个表,该表包含与原始表相同的列以及符合条件的记录。 LookUp 在应用公式将记录减少为单个值后,仅返回找到的第一条记录。 如果未找到记录,Filter 和 Search 将返回空表,LookUp 将返回空白。
表格是一个值,Power Apps 就像字符串或数字一样。 可以向函数传递表,也可以从函数返回表。 Filter、Search 和 LookUp 不会修改表。 相反,它们将表作为参数,并从中返回表、记录或单个值。 请参阅使用表,了解更多详细信息。
代理
如果可能,Power Apps 会将筛选和排序操作委派给数据源,并根据需要在结果中翻页。 例如,当您启动一个应用程序来显示填充了数据的 Gallery 控件时,最初只会将第一组记录导入到设备中。 当用户滚动时,会将数据源中的其他数据转入下页。 这样,应用程序的启动时间更短,并且可以访问非常大的数据集。
但是,可能并非总是可以进行委派。 各数据源对委派支持的函数和运算符可能有所不同。 如果无法进行完全公式委派,则创作环境将用一条警告来标记无法委派的部分。 如果可能,请考虑更改公式以避免出现无法委派的函数和运算符。 委派列表详细说明了可以委派的数据源和操作。
如果无法进行委派,则 Power Apps 将仅拉取一小部分记录以在本地进行处理。 筛选和排序函数将对少数一部分记录进行操作。 Gallery 中提供的内容可能不是整个过程,这可能会使用户感到困惑。
有关详细信息,请参阅委派概述。
语法
Filter(表*,公式 1[,公式 2,... ])
- Table- 必需。 要搜索的表。
- 公式- 必需。 计算表的每个记录时所依据的公式。 此函数返回计算结果为 true 的所有记录。 可以引用表中的列。 如果提供多个公式,则通过 And 函数将所有公式的结果合并。
Search(Table*,SearchString,Column1[,Column2,... ])
- Table- 必需。 要搜索的表。
- SearchString- 必需。 要搜索的字符串。 如果为空白或者是空字符串,将返回所有记录。
- Columns- 必需。 要在表中搜索的列的名称。 如果在任意这些列的数据中找到了作为部分匹配项的 SearchString,将返回完整记录。
备注
在 Power Apps 3.24042 之前的版本中,Search 函数的列名是使用双引号的文本字符串指定的,如果连接到数据源,它们也需要是逻辑名称。 例如,使用带双引号的逻辑名称 "cr43e_name",而不是不带引号的显示名称 Name。 对于列名称带空格的 SharePoint 和 Excel 数据源,每个空格都用 "x0020" 指定,例如 "Column Name" 为 "Column_x0020_Name"。 在此版本之后,所有应用程序都自动更新到本文描述的新语法。
LookUp(表*,公式[,减少公式])
- Table- 必需。 要搜索的表。 在 UI 中,此语法显示为函数框上方的源。
- 公式- 必需。 计算表的每个记录时所依据的公式。 此函数返回计算结果为 true 的第一条记录。 可以引用表中的列。 在 UI 中,此语法显示为函数框上方的条件。
- ReductionFormula- 可选。 此公式会对找到的记录进行计算,然后将记录缩减为一个值。 可以引用表中的列。 如果没有使用这个参数,此函数将返回表中的完整记录。 在 UI 中,此语法显示为函数框上方的结果。
示例
以下示例使用 IceCream 数据源:
公式 | 说明 | 结果 |
---|---|---|
Filter(IceCream, OnOrder > 0) | 返回 OnOrder 大于零的记录。 | |
Filter(IceCream, Quantity + OnOrder > 225) | 返回 Quantity 和 OnOrder 列的总和大于 225 的记录。 | |
Filter(IceCream, "chocolate" in Lower(Flavor)) | 返回其 Flavor 名称中出现单词 "chocolate"(不区分字母大小写)的记录。 | |
Filter(IceCream, Quantity < 10 & OnOrder < 20) | 返回 Quantity 小于 10 且 OnOrder 小于 20 的记录。 没有符合这些条件的记录,因此将返回空表。 | |
Search(IceCream, "choc", Flavor) | 返回其 Flavor 名称中出现字符串 "choc"(不区分字母大小写)的记录。 | |
Search(IceCream, "", Flavor) | 因为搜索词为空,所以将返回所有记录。 | |
LookUp(IceCream, Flavor = "chocolate", Quantity) | 搜索 Flavor 等于 "Chocolate" 的记录,其中有一个此类记录。 对于找到的第一个记录,将返回该记录的 Quantity。 | 100 |
LookUp(IceCream, Quantity > 150, Quantity + OnOrder) | 搜索 Quantity 大于 150 的记录,其中有多个此类记录。 对于找到的第一个 Flavor 为 "Vanilla" 的记录,将返回 Quantity 和 OnOrder 列的总和。 | 250 |
LookUp(IceCream, Flavor = "pistachio", OnOrder) | 搜索 Flavor 等于 "Pistachio" 的记录,其中不存在此类记录。 由于未找到匹配项,Lookup 将返回空白。 | 空白 |
LookUp(IceCream, Flavor = "vanilla") | 搜索 Flavor 等于 "Vanilla" 的记录,其中有一个此类记录。 由于未提供归约公式,因此将返回完整记录。 | { Flavor: "Vanilla", Quantity: 200, OnOrder: 75 } |
使用选择列筛选
以下示例使用 Microsoft Dataverse 中的 客户 表作为数据源。 本示例将演示如何根据选定的 Combo box 控件值 筛选 客户列表:
分步操作
- 打开一个空白应用。
- 通过选择 新建屏幕 选项来添加新屏幕。
- 在 插入 选项卡上,选择 Gallery,然后选择 垂直。
- 在右侧窗格的 属性 选项卡上,打开 数据源,然后选择 客户。
- (可选)在 布局 列表中,选择不同的选项。
- 在 插入 选项卡上,选择 输入,然后选择 Combo box。 重复此步骤以再添加两个 Combo box 控件。
- 对于每个 Combo box 控件,在右侧窗格的 属性 选项卡上,打开 数据源,然后选择 客户。 选择 字段 选项旁边的 编辑,然后选择 主要文本 和 SearchField 值。主要文本 应该是要添加到组合框的选项列。 对其他两个 Combo box 控件重复此步骤。
- 现在,选择 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 数据源:
在许多应用中,您可在搜索框中键入一个或多个字符来对较大数据集中的记录列表进行筛选。 键入时,列表中仅显示与搜索条件匹配的记录。
本文其余部分中的示例演示了搜索包含此数据的结果:
若要将此数据源创建为集合,请创建一个 Button 控件,并将其 OnSelect 属性设置为以下公式:
ClearCollect(客户, 表({ 名称:“Fred Garcia”,公司:“Northwind Traders” },
{ 名称:“Cole Miller”,公司:“Contoso” },
{ 名称:“Glenda Johnson”,公司:“Contoso” },
{ 名称:“Mike Collins”,公司:“Adventure Works” },
{ 名称:“Colleen Jones”,公司:“Adventure Works” }))
如此示例中所示,可在屏幕底部的 Gallery 控件 中显示记录列表。 在靠近屏幕顶部的位置,可添加名为 SearchInput 的 Text input 控件,以便用户能够指定对哪些记录感兴趣。
当用户在 SearchInput 中键入字符时,系统将自动筛选库中的结果。 在本例中,库被配置为显示客户名称(不是公司名称)以 SearchInput 中的字符序列开头的记录。 如果用户在搜索框中键入 co,库将显示以下结果:
若要基于 Name 列进行筛选,需将 Gallery 控件的 Items 属性设置为以下公式之一:
公式 | 描述 | 结果 |
---|---|---|
Filter(客户, StartsWith(名称, SearchInput.Text)) | 筛选 Customers 数据源,查找搜索字符串出现在 Name 列开头的记录。 测试不区分大小写。 如果用户在搜索框中键入 co,库将显示 Colleen Jones 和 Cole Miller。 库不会显示 Mike Collins,因为该记录的 Name 列不以搜索字符串开头。 | |
Filter(Customers, SearchInput.Text in Name) | 筛选 Customers 数据源,查找搜索字符串出现在 Name 列中任意位置的记录。 测试不区分大小写。 如果用户在搜索框中键入 co,库将显示 Colleen Jones、Cole Miller 和 Mike Collins,因为搜索字符串都出现在所有这些记录的 Name 列中的某个位置。 | |
Search(客户, SearchInput.Text, 名称) | 与使用 in 运算符类似,Search 函数从每条记录的 Name 列中的任意位置搜索匹配项。 您必须将列名称括在双引号内。 |
可以扩展搜索,使其包括 Company 列以及 Name 列:
公式 | 描述 | 结果 |
---|---|---|
Filter(Customers, StartsWith(Name, SearchInput.Text) | StartsWith(公司, SearchInput.Text)) | |
Filter(customers, SearchInput.Text in Name | SearchInput 的公司中的文本) | |
Search(客户, SearchInput.Text, 姓名, 公司) | 与使用 in 运算符类似,Search 函数筛选 Customers 数据源,查找 Name 列或 Company 列任意位置包含搜索字符串(例如 co)的记录。 如果希望指定多个列和多个 in 运算符,那么 Search 函数会比 Filter 更易于读取和写入。 |