11.3 CONTAINS


## CONTAINS CONTAINS (

, , , [ , , [ … ] ] )如果指定的
至少存在一行满足所有都有对应的,返回 true,否则 CONTAINS 返回 false。| 参数 | 属性 | 描述 | | :—-: | :—-: | :—-: | | Table | | 物理表或返回表的表达式 | | ColumnName | 可重复 | 使用标准 DAX 语法的现有列的名称,不支持表达式 | | Value | 可重复 | 任何返回单个标量值的 DAX 表达式,该值将在 columnName 中查找 |

注意:

  • ColumnName和Value必须成对使用,否则将报错
  • ColumnName 必须属于第一参数或第一参数的扩展表
  • 当ColumnName属于扩展表时,必须使用完全限定的名称(表[列名])

    示例用法

    使用FILTERCALCULATETABLE的组合可以筛选表中的行。但是,如果需要检查表中是否至少存在一行满足特定的条件,使用这些函数会产生额外不必要的计算过程。在作为第一参数的表中,CONTAINS 函数检查是否至少有一行包含后续参数中指定的所有列值。比如你想检查销售表中是否至少包含一行单价为 99.99 的销售记录。因为 CONTAINS 的结果是一个标量值,所以可以将它嵌入到一个 ROW 函数中来执行查询:EVALUATEROW ( “Sales Exist”, CONTAINS ( Sales, Sales[Unit Price], 99.99 ) )11.3 CONTAINS - 图1上述查询与下面这个等价:EVALUATEROW (“Sales Exist”, COUNTROWS ( CALCULATETABLE ( Sales, Sales[Unit Price] = 99.99 ) ) > 0)CONTAINS 为简单筛选提供了更好的性能,而CALCULATETABLE适用于复杂的筛选表达式。CONTAINS 只检查精确匹配,如果需要更复杂的筛选条件,则必须使用CALCULATETABLEFILTER或混合使用。不过,CONTAINS 函数允许你组合多列作为条件,这些列可以属于通过关系可访问的表。例如,如果澳大利亚至少包含了一行单价为 99.99 的销售记录,那么以下查询返回 TRUE:EVALUATEROW (“Sales Australia”, CONTAINS (Sales,Sales[Unit Price], 99.99,Customer[CountryRegion], “Australia”))11.3 CONTAINS - 图2在这个示例中,上面的查询与下面这个等价: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]11.3 CONTAINS - 图3如你所见,CONTAINS 函数在每个日期所在的行上下文中计算。RELATEDTABLE函数将此行上下文转换为筛选上下文,因此 CONTAINS 仅考虑这些行的销售额,并在该日期Columbus至少存在一行记录时返回 TRUE。介绍 TREATAS 时你会了解到,在所有通过查找和匹配执行虚拟筛选的函数中,TREATAS 效率最高,而 CONTAINS 适用于无法使用 TREATAS 和 INTERSECT 的场景。