问题陈述
我正在 Microsoft 365 的 Excel 中使用 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 Rosenfeld 的回答很有启发性,我认为我应该添加一个他建议的演示,以便我尝试理解这种行为。按照 Ron 的建议添加自定义列时,结果如下:
答案1
这是关于以下行为的记录(尽管隐藏得很好):null
相比之下。
如果您使用以下公式向原始表添加自定义列,则可以看到它:
not Text.EndsWith([Column2],"foo")`
您会注意到此返回null
无论您是否包括not
。
并且由于Table.SelectRows
仅返回那些评估为True
,它将不会返回包含null
您需要做的就是采取解决方法,尽管您可以使用coalesce
如下运算符来缩短它:
Table.SelectRows(#"Added Custom", each not Text.EndsWith([Column2] ?? "x", "foo"))
通过评估左侧来工作??
,除非它为空,在这种情况下评估右侧。