当需要根据多个条件判断表中是否存在符合要求的记录时,IN 的写法更为简洁。例如:
- FILTER (
- ALL ( DimProduct[Color] ),
- DimProduct[Color] = "Red"
- || DimProduct[Color] = "Yellow"
- || DimProduct[Color] = "Blue"
- )
- ------------- 等价于 ----------------
- FILTER(ALL(DimProduct[Color]), [Color] IN { "Red", "Yellow", "Blue" })
复制代码
在数据类型和运算符一文中,我们介绍过 IN,它等价于 CONTAINSROW 函数
支持环境
- Power BI Desktop:从 2016 年 11 月之后的版本
- Excel:Excel 2016 Verson 1701 及之后的版本
- SQL Server 分析服务:SQL Server 2016 之后的版本
CONTAINSROW- CONTAINSROW ( <Table>, <Value>, [ <Value>, [ … ] ] )
复制代码
如果表中存在或包含一行使得所有列都具有指定的值,则返回 TRUE,否则返回 FALSE。除语法外,IN CONTAINSROW 函数在功能上是等价的。
参数 | 属性 | 描述 | Table | | 需要进行查找的表 | Value | 可重复 | 在对应的列进行查找的标量表达式 |
以下写法判断产品表颜色列是否存在颜色为红色、蓝色或黄色的行,两种写法等价:
- CONTAINSROW ( { "Red", "Blue", "Yellow" }, Product[Color] )
- Product[Color] IN { "Red", "Blue", "Yellow" }
复制代码 使用动态查找表
查找表可以是一个动态的表表达式,如下面的例子所示,它返回除了所选颜色以外的所有其他颜色的销售额:
- Other Colors :=
- CALCULATE (
- [Sales Amount],
- Products[Color] IN
- EXCEPT (
- ALL ( Products[Color] ),
- VALUES ( Products[Color] )
- )
- )
复制代码- Other Colors 2 :=
- CALCULATE (
- [Sales Amount],
- EXCEPT (
- ALL ( Products[Color] ),
- VALUES ( Products[Color] )
- )
- )
复制代码
请注意,上面的语法只是应用于 IN 的动态表达式的一个演示。实际应用中,这个需求可以直接使用 EXCEPT 来获得精确的结果。
否定判断
DAX 不支持 NOT IN 运算符,要执行 IN 的否定运算,你需要将 NOT 放在整个表达式前面:
- NOT [Color] IN { "Red", "Yellow", "Blue" }
复制代码 多列匹配- ( 'Date'[Year], 'Date'[MonthNumber] ) IN { ( 2018, 12 ), ( 2019, 1 ) }
- CONTAINSROW ( { ( 2018, 12 ), ( 2019, 1 ) }, 'Date'[Year], 'Date'[MonthNumber] )
复制代码- FILTER (
- SUMMARIZE ( DimProduct, [Color], [Size] ),
- ( [Color], [Size] ) IN { ( "Black", "L" ) }
- )
- FILTER (
- SUMMARIZE ( DimProduct, [Color], [Size] ),
- CONTAINSROW ( { ( "Black", "L" ) }, [Color], [Size] )
- )
复制代码 不具有数据沿袭
在创建内联表的表构造器一节介绍过,表构造器结果是一个数据类型,但是它没有任何与数据库底层列相对应的数据沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。 |