使用Power Query比较两表匹配列(列数不固定时)
Power Query批量比较带old/new后缀的列
方法一:用List.Transform + List.AnyTrue(推荐,无需字符串拼接)
这种方法无需手动拼接表达式字符串,通过列表操作动态生成比较逻辑,更安全且适配特殊列名:
CompareColumns = let // 提取所有原始列名(去除.old/.new后缀) originalColumns = List.Distinct(List.Transform(Table.ColumnNames(priorStep), each Text.BeforeDelimiter(_, "."))), // 添加比较列:判断任意一对old/new列是否不同 addComparisonColumn = Table.AddColumn(priorStep, "newColumnName", each List.AnyTrue(List.Transform(originalColumns, (colName) => Record.Field(_, colName & ".old") <> Record.Field(_, colName & ".new") )) ) in addComparisonColumn
- 逻辑说明:遍历每个原始列名,对当前行的
colName.old和colName.new列做比较,最后用List.AnyTrue判断是否存在至少一对不同的列,返回true或false。 - 优势:自动适配所有列,无需手动添加
ColumnN的判断;列名含特殊字符(空格、括号等)时也能正常工作。
方法二:用Expression.Evaluate实现字符串转逻辑
如果坚持用字符串拼接的思路,可以简化表达式生成步骤,避免手动逐行编写:
CompareColumns = let originalColumns = List.Distinct(List.Transform(Table.ColumnNames(priorStep), each Text.BeforeDelimiter(_, "."))), // 自动生成比较表达式字符串 compareExpression = Text.Combine( List.Transform(originalColumns, (col) => "[" & col & ".old] <> [" & col & ".new]"), " or " ), // 转换字符串为可执行逻辑并添加列 addComparisonColumn = Table.AddColumn(priorStep, "newColumnName", each Expression.Evaluate(compareExpression, [_=_]) ) in addComparisonColumn
- 注意事项:如果列名包含空格或特殊字符,需要把列名用
#""包裹,比如#"My Column.old",此时可修改拼接逻辑为:"#""" & col & ".old"" <> #""" & col & ".new""""。
内容的提问来源于stack exchange,提问作者M.Sqrl
相关产品推荐
相关产品推荐

