11.3 CONTAINS
## CONTAINS
CONTAINS (
注意:
- ColumnName和Value必须成对使用,否则将报错
- ColumnName 必须属于第一参数或第一参数的扩展表
- 当ColumnName属于扩展表时,必须使用完全限定的名称(表[列名])
示例用法
使用FILTER和CALCULATETABLE的组合可以筛选表中的行。但是,如果需要检查表中是否至少存在一行满足特定的条件,使用这些函数会产生额外不必要的计算过程。在作为第一参数的表中,CONTAINS 函数检查是否至少有一行包含后续参数中指定的所有列值。比如你想检查销售表中是否至少包含一行单价为 99.99 的销售记录。因为 CONTAINS 的结果是一个标量值,所以可以将它嵌入到一个 ROW 函数中来执行查询:EVALUATEROW ( “Sales Exist”, CONTAINS ( Sales, Sales[Unit Price], 99.99 ) )上述查询与下面这个等价:EVALUATEROW (“Sales Exist”, COUNTROWS ( CALCULATETABLE ( Sales, Sales[Unit Price] = 99.99 ) ) > 0)CONTAINS 为简单筛选提供了更好的性能,而CALCULATETABLE适用于复杂的筛选表达式。CONTAINS 只检查精确匹配,如果需要更复杂的筛选条件,则必须使用CALCULATETABLE、FILTER或混合使用。不过,CONTAINS 函数允许你组合多列作为条件,这些列可以属于通过关系可访问的表。例如,如果澳大利亚至少包含了一行单价为 99.99 的销售记录,那么以下查询返回 TRUE:EVALUATEROW (“Sales Australia”, CONTAINS (Sales,Sales[Unit Price], 99.99,Customer[CountryRegion], “Australia”))在这个示例中,上面的查询与下面这个等价:EVALUATEROW (“Sales Australia”, COUNTROWS (CALCULATETABLE (Sales,Sales[Unit Price] = 99.99,Customer[CountryRegion] = “Australia”)) > 0)CONTAINS 的一个适用场景是,如果你希望从另一个表中获得至少有一个对应行的元素的列表时,可以将 CONTAINS 作为筛选条件。以下查询返回Columbus至少有一笔销售记录的日期列表:EVALUATEFILTER (VALUES ( ‘Date’[Date] ),CONTAINS ( RELATEDTABLE ( Sales ), Customer[City], “Columbus” ))ORDER BY ‘Date’[Date]如你所见,CONTAINS 函数在每个日期所在的行上下文中计算。RELATEDTABLE函数将此行上下文转换为筛选上下文,因此 CONTAINS 仅考虑这些行的销售额,并在该日期Columbus至少存在一行记录时返回 TRUE。介绍 TREATAS 时你会了解到,在所有通过查找和匹配执行虚拟筛选的函数中,TREATAS 效率最高,而 CONTAINS 适用于无法使用 TREATAS 和 INTERSECT 的场景。