如何在Power Query M中合并同结构表并将列相等值替换为null
Power Query 列对比置空实现方案
前置准备
确保已完成新旧表按ID字段内连接,展开新表列时添加了统一后缀(示例中用的是1,可自定义为_new等易识别的后缀)
完整M代码实现
将以下代码添加到合并展开步骤之后,按需修改参数区的配置即可直接使用:
// ------------- 可修改参数区 ------------- // 主键列名 PrimaryKey = "ID", // 新表列的统一后缀 NewColumnSuffix = "1", // 数值对比精度阈值,避免浮点误差导致误判,不需要可设为0 Epsilon = 0.0001, // 替换为你上一步合并展开后的步骤名称 PrevStep = #"合并展开后的表", // ------------- 逻辑处理区 ------------- // 提取所有待对比的旧字段(排除主键、排除带新后缀的字段) AllColumns = Table.ColumnNames(PrevStep), OldFieldList = List.Select(AllColumns, each _ <> PrimaryKey and not Text.EndsWith(_, NewColumnSuffix)), // 逐行逐字段对比处理 ProcessedTable = Table.FromRecords( Table.TransformRows(PrevStep, (row) => List.Accumulate( OldFieldList, [ ID = row[PrimaryKey] ], (record, field) => let OldVal = row[field], NewVal = row[field & NewColumnSuffix], // 兼容数值和其他类型的判等逻辑 IsEqual = if Value.Is(OldVal, type number) and Value.Is(NewVal, type number) then Number.Abs(OldVal - NewVal) < Epsilon else OldVal = NewVal, FinalVal = if IsEqual then null else NewVal in Record.AddField(record, field, FinalVal) ) ) )
逻辑说明
- 自动匹配字段对:无需手动罗列所有字段,只要新列后缀统一即可自动配对,适配任意数量的同结构字段
- 浮点兼容:默认配置的精度阈值可避免小数计算误差导致的误判
- 直接输出目标结构:输出结果自动保留主键+原有字段名,无需额外调整列名
内容的提问来源于stack exchange,提问作者Christopher Sabol
相关产品推荐
相关产品推荐

