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