问题陈述
我在 Excel for Microsoft 365 中使用 Power Query。
我发现将文本过滤器应用于列匹配空值的情况。这会导致不必要的行删除。我已经找到了解决此问题的方法,但我试图理解为什么会出现这种行为或者它是否是一个错误。
下面的屏幕截图显示了我未过滤的数据以及应用此 M 语言过滤器的结果:
= Table.SelectRows(#"Changed Type", each not Text.EndsWith([Column 2], "foo"))
通过将空值替换到过滤器的谓词中,我们得到:
not Text.EndsWith(null, "foo")
not false
true
因此,应保留“anteater”行(因为“Column 2”的该行值不以“foo”结尾),但该行被丢弃。
解决方法
假设我按如下方式更改过滤器:
= Table.SelectRows(#"Changed Type", each not Text.EndsWith([Column 2], "foo") Or [Column 2] = null)
在这种情况下,我们得到:
这是期望的结果。
我的问题
为什么“第 2 列”中具有空值的行被我的第一个过滤器过滤掉?或者,这是一个错误吗?
编辑以添加所选答案的演示
罗恩·罗森菲尔德的回答很有启发性,我认为我应该添加一个演示,说明他建议我尝试理解这种行为。当按照 Ron 的建议添加自定义列时,结果如下:
这是关于比较行为的记录(尽管隐藏得很好)的行为
null
。如果使用以下公式将自定义列添加到原始表中,您就可以看到它:
您将注意到
null
无论您是否包含not
.并且由于
Table.SelectRows
仅返回那些评估为 的行True
,因此它不会返回包含null
您的解决方法就是您需要做的,尽管您可以通过使用
coalesce
如下运算符来缩短它:其
??
工作原理是评估左侧,除非它为空,在这种情况下评估右侧。