DAX问题:从文本列提取匹配用户值的度量值返回空值
问题
我创建了两个虚拟表:Narrative表和User表,二者为一对多(1-*)关系。我编写了一段DAX度量值,用于识别Narrative列中提及的User列用户,但该度量值始终返回空值。尝试过使用FIND函数和CONTAINSSTRING函数,均无法从User列返回匹配值。
度量值代码如下:
MatchedUsers = VAR NarrativeText = MAX('Narrative'[Narrative]) RETURN CALCULATE( CONCATENATEX( FILTER( VALUES('User'[User]), NOT(ISBLANK(NarrativeText)) && CONTAINSSTRING(NarrativeText, 'User'[User]) ), 'User'[User], ", " ) )
期望该度量值返回Narrative列中提及的User列用户名称,预期效果如下:
| Narrative | User |
|---|---|
| The tree is green | |
| Tim's tree is green | |
| Tim, Sarah, Anne, Fred | Sarah, Anne |
| Jack, Sarah | Jack, Sarah |
| It is sunny outside |
问题原因与解决方案
你的度量值返回空值的核心原因是一对多表关系的上下文筛选限制:在Narrative表的行上下文环境中,CALCULATE会自动应用表间的关系筛选,导致VALUES('User'[User])只能返回当前Narrative行关联的用户,而非全部用户列表,因此无法匹配文本中提及的其他用户。
修正后的度量值需要绕开关系筛选的影响,同时优化逻辑严谨性:
MatchedUsers = VAR NarrativeText = MAX('Narrative'[Narrative]) RETURN IF( ISBLANK(NarrativeText), BLANK(), CONCATENATEX( FILTER( ALL('User'[User]), // 获取所有用户的唯一值,不受关系筛选限制 NOT(ISBLANK('User'[User])) && // 排除空用户条目 CONTAINSSTRING(NarrativeText, 'User'[User]) ), 'User'[User], ", " ) )
关键修正说明
- 替换
VALUES('User'[User])为ALL('User'[User]):解除表关系带来的筛选限制,确保能遍历所有用户进行匹配。 - 增加空用户判断:避免
User表中的空值被误判为匹配结果。 - 外层
IF判断:提前处理空文本场景,让度量值逻辑更清晰高效。
内容的提问来源于stack exchange,提问作者SonzPortal
相关产品推荐
相关产品推荐

