DAX中CONTAINS()函数匹配多值拼接列异常问题求助
问题描述
创建了如下DAX度量值:
Contains = IF(CONTAINS(Flags, Flags[FlagsConcat], SELECTEDVALUE(SlicerFlags[FlagNames])),1,-1)
Flags表的FlagsConcat列是多值拼接结果,示例数据如下:
| id | Bco | Nat | Gur | Ga | An | Sim | Oak | Ort | FlagsConcat |
|---|---|---|---|---|---|---|---|---|---|
| 1826 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | Oakpoint,Orthoselect |
| 1784 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | Oakpoint,Orthoselect |
| 1503 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Guardian |
| 1502 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Guardian |
| 1500 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Guardian |
| 1499 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Guardian |
| 1326 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Guardian |
| 925 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Guardian |
切片器SlicerFlags的FlagNames值包括:
- Benco
- National
- Guardian-Simply Clear
- Guardian
- Angel Align
- Simply Clear
- Oakpoint
- Orthoselect
- None
当前问题:在切片器中选中Guardian时,度量值返回1;但选中Oakpoint或Orthoselect时,尽管表中有对应行包含这些值,度量值却返回-1。调整逗号前后的空格后问题仍未解决。
问题原因与解决方法
原因
CONTAINS函数执行的是精确字符串匹配,它会检查Flags表中是否存在某一行的FlagsConcat列值与切片器选中的FlagNames值完全相等:
- 选中
Guardian时,Flags表中存在FlagsConcat值为Guardian的行,精确匹配成功,返回1。 - 选中
Oakpoint时,Flags表中对应的FlagsConcat值是Oakpoint,Orthoselect,与Oakpoint并非完全相同的字符串,因此匹配失败,返回-1。
解决方法
需要改用支持子字符串包含匹配的函数,以下两种方案均可:
方案1:使用CONTAINSSTRING
CONTAINSSTRING专门用于检查一个字符串是否包含另一个子字符串,直接替换原度量值即可:
Contains = IF(CONTAINSSTRING(Flags[FlagsConcat], SELECTEDVALUE(SlicerFlags[FlagNames])), 1, -1)
方案2:使用SEARCH
SEARCH会返回子字符串在目标字符串中的起始位置,若不存在则返回错误,结合ISERROR判断即可:
Contains = IF(NOT(ISERROR(SEARCH(SELECTEDVALUE(SlicerFlags[FlagNames]), Flags[FlagsConcat]))), 1, -1)
注:
SEARCH不区分大小写,若需要区分大小写的匹配,可改用FIND函数。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

