在PowerQuery安全地移除字段

原文译注:Davis ZHANG


在这里插入图片描述

在Power Query, 如果你要移除一个不存在的字段,你将遇到错误。尽管您可能不会故意删除不存在的列,但是当您从数据源中删除了该列时,就可能会发生此情况。

防止这种错误发生的主流方法是使用Table.SelectColumns函数,而非Table.RemoveColumns,但当你要选择的列过多时,就可能使你的M查询代码过于冗长。在本文,我将展示另一种解决方案。

案例数据

为了更好地说明该问题,我将使用仅有两个查询结果的简单数据集:

  1. 源表
  2. 转换表

源表

这是包含原数据的最初查询结果,你可以把它想象成SQL Server中的视图或Excel中的一张表。

在这里插入图片描述

let
    Source = #table(
        type table [A=number, B=number],
        { {1, 2}, {3, 4} }
    )
in
    Source

转换表

该查询在源表的基础上移除了B列。

在这里插入图片描述

let
    Source = #"Source Table",
    #"Removed Columns" = Table.RemoveColumns(Source,{"B"})
in
    #"Removed Columns"

问题

如果我们使用上述查询,是没问题的,但当我们从源表移除B列后,将会引发错误:

let
    Source = #table(
        type table [A=number, B=number],
        { {1, 2}, {3, 4} }
    ),
    #"Removed Columns" = Table.RemoveColumns(Source,{"B"})
in
    #"Removed Columns"

现在我们看转换表的查询,我们将得到如下错误:

Expression.Error: The column ‘B’ of the table wasn’t found. Details: B

这个错误发生的原因是,我们指示Power Query去移除一个在源表已经不存在的列 – B列。

解决方案

为避免此错误发生,你只需使用Table.RemoveColumns的第三个可选参数,用于处理丢失的字段。
你可以使用MissingField.Ignore或MissingField.UseNull作为参数值(两种参数在此都实现了同样的效果):

let
    Source = #"Source Table",
    #"Removed Columns" = Table.RemoveColumns(
        Source,
        {"B"},
        MissingField.Ignore
    )
in
    #"Removed Columns"

现在错误被排除了,且查询仅返回了A列 🙂

一个想法

不幸的是,Table.TransformColumnTypes函数没有对应的参数去处理丢失字段,尽管在某些场景下这将十分有用。如果你支持该想法,请点此投票。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可
关于本文,如有问题或建议,欢迎您前往知乎微软BI圈发帖(备注本文链接),我将尽快回复