[知识体系] 理解 CONTAINS

  [复制链接]
查看87453 | 回复106 | 2021-2-21 18:56:46 | 显示全部楼层 |阅读模式
CONTAINS
如果指定的《table》至少存在一行满足所有《ColumnName》都有对应的《Value》,返回 true,否则 CONTAINS 返回 false。
如果指定的《table》至少存在一行满足所有《ColumnName》都有对应的《Value》,返回 true,否则 CONTAINS 返回 false。
  1. CONTAINS ( <Table>, <ColumnName>, <Value>, [ <ColumnName>, <Value>, [ … ] ] )
复制代码


如果指定的<table>至少存在一行满足所有<ColumnName>都有对应的<Value>,返回 true,否则 CONTAINS 返回 false。

参数属性描述
Table物理表或返回表的表达式
ColumnName可重复使用标准 DAX 语法的现有列的名称,不支持表达式
Value可重复任何返回单个标量值的 DAX 表达式,该值将在 columnName 中查找

注意:

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

示例用法

使用 FILTERCALCULATETABLE 的组合可以筛选表中的行。但是,如果需要检查表中是否至少存在一行满足特定的条件,使用这些函数会产生额外不必要的计算过程。在作为第一参数的表中,CONTAINS 函数检查是否至少有一行包含后续参数中指定的所有列值。


比如你想检查销售表中是否至少包含一行单价为 99.99 的销售记录。因为 CONTAINS 的结果是一个标量值,所以可以将它嵌入到一个 ROW 函数中来执行查询:

  1. EVALUATE
  2. ROW ( "Sales Exist", CONTAINS ( Sales, Sales[Unit Price], 99.99 ) )
复制代码



7100211936391.jpeg



上述查询与下面这个等价:

  1. EVALUATE
  2. ROW (
  3.     "Sales Exist", COUNTROWS ( CALCULATETABLE ( Sales, Sales[Unit Price] = 99.99 ) ) > 0
  4. )
复制代码


CONTAINS 为简单筛选提供了更好的性能,而 CALCULATETABLE 适用于复杂的筛选表达式。CONTAINS 只检查精确匹配,如果需要更复杂的筛选条件,则必须使用 CALCULATETABLEFILTER 或混合使用。不过,CONTAINS 函数允许你组合多列作为条件,这些列可以属于通过关系可访问的表。例如,如果澳大利亚至少包含了一行单价为 99.99 的销售记录,那么以下查询返回 TRUE:

  1. EVALUATE
  2. ROW (
  3.     "Sales Australia", CONTAINS (
  4.         Sales,
  5.         Sales[Unit Price], 99.99,
  6.         Customer[CountryRegion], "Australia"
  7.     )
  8. )
复制代码



7100211936392.jpeg



在这个示例中,上面的查询与下面这个等价:

  1. EVALUATE
  2. ROW (
  3.     "Sales Australia", COUNTROWS (
  4.         CALCULATETABLE (
  5.             Sales,
  6.             Sales[Unit Price] = 99.99,
  7.             Customer[CountryRegion] = "Australia"
  8.         )
  9.     ) > 0
  10. )
复制代码


CONTAINS 的一个适用场景是,如果你希望从另一个表中获得至少有一个对应行的元素的列表时,可以将 CONTAINS 作为筛选条件。以下查询返回 Columbus 至少有一笔销售记录的日期列表:

  1. EVALUATE
  2. FILTER (
  3.     VALUES ( 'Date'[Date] ),
  4.     CONTAINS ( RELATEDTABLE ( Sales ), Customer[City], "Columbus" )
  5. )
  6. ORDER BY 'Date'[Date]
复制代码



7100211936393.jpeg



如你所见,CONTAINS 函数在每个日期所在的行上下文中计算。RELATEDTABLE 函数将此行上下文转换筛选上下文,因此 CONTAINS 仅考虑这些行的销售额,并在该日期 Columbus 至少存在一行记录时返回 TRUE。

介绍 TREATAS 时你会了解到,在所有通过查找和匹配执行虚拟筛选的函数中,TREATAS 效率最高,而 CONTAINS 适用于无法使用 TREATASINTERSECT 的场景。

回复

使用道具 举报

Veebo | 2021-4-24 15:11:06 来自手机 | 显示全部楼层
我了个去,顶了
回复

使用道具 举报

雄蟹 | 2021-8-7 11:53:02 | 显示全部楼层
前排支持下
回复

使用道具 举报

天山村夫 | 2021-9-17 08:37:05 来自手机 | 显示全部楼层
珍爱生命,果断回帖。
回复

使用道具 举报

wugang8023 | 2021-9-24 22:53:44 | 显示全部楼层
LZ是天才,坚定完毕
回复

使用道具 举报

67198194 | 2021-11-11 14:00:13 来自手机 | 显示全部楼层
我也顶起出售广告位
回复

使用道具 举报

新界一只牛 | 2021-11-12 07:17:41 来自手机 | 显示全部楼层
感謝云发教育!!!
回复

使用道具 举报

oceanw | 2021-11-21 18:33:06 来自手机 | 显示全部楼层
众里寻他千百度,蓦然回首在这里!
回复

使用道具 举报

beelau | 2022-1-22 21:29:13 | 显示全部楼层
呵呵,低调,低调!
回复

使用道具 举报

lwfeng | 2022-2-11 14:21:36 来自手机 | 显示全部楼层
好,很好,非常好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则