Power Query:为什么文本过滤器会删除空值?

Power Query:为什么文本过滤器会删除空值?

问题陈述

我正在 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"))

通过评估左侧来工作??,除非它为空,在这种情况下评估右侧。

相关内容