Power Query多条件(含子字符串)合并表的实现方法
Power Query 自定义左连接实现方案
针对你需要的左连接逻辑,直接用Power Query原生合并功能无法满足,得通过自定义函数结合文本匹配实现,具体步骤和代码如下:
1. 准备示例数据(替换为你的实际表)
先将示例表转为Power Query可识别的格式,M代码如下:
// 表1 let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjDUByIjAyNjAyUNJRMjBQ0lEyNjAQMlGKjQUA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [date = _t, firstName = _t, lastName = _t, ID = _t]), ChangedType = Table.TransformColumnTypes(Source,{{"date", type date}, {"firstName", type text}, {"lastName", type text}, {"ID", type text}}) in ChangedType // 表2 let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjDUByIjAyNjAyUNJRMjBQ0lEyNjAQMlGKjQUA5I2NlQwNlIwNlYwNlYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [date = _t, metadata = _t, ID = _t]), ChangedType = Table.TransformColumnTypes(Source,{{"date", type date}, {"metadata", type text}, {"ID", type nullable text}}) in ChangedType
2. 创建自定义匹配函数
在Power Query编辑器中,点击「主页」→「新建源」→「空白查询」,重命名为fn_MatchTable2,输入以下M代码:
(table1Row as record, table2 as table) as list => let // 提取表1当前行的关键信息 id = table1Row[ID], firstName = table1Row[firstName], lastName = table1Row[lastName], // 筛选表2中符合条件的行 matchedRows = Table.SelectRows(table2, each // 条件1:ID直接匹配 ([ID] <> null and [ID] = id) // 条件2:表1的ID出现在metadata文本中 or Text.Contains([metadata], id) // 条件3:firstName和lastName同时出现在metadata文本中 or (Text.Contains([metadata], firstName) and Text.Contains([metadata], lastName)) ) in matchedRows
3. 执行左连接并整理结果
回到表1的查询界面:
- 点击「添加列」→「自定义列」,输入公式:
fn_MatchTable2(_, Table2)(Table2替换为你的实际表2名称),点击确定后会生成包含匹配行列表的自定义列。 - 点击自定义列右侧的展开按钮,选择需要保留的表2字段(如date、metadata、ID),选择「展开到新行」(若一个表1行匹配多个表2行,会拆分为多行;如需合并为一行可选择「合并值」,按需调整)。
- 最后调整列顺序、删除冗余列,即可得到最终左连接结果。
补充说明
- 默认
Text.Contains不区分大小写,若需区分,可修改为Text.Contains([metadata], id, Comparer.Ordinal) - 若metadata存在ID部分匹配的情况(如
12345和123456),可改用正则精确匹配,将条件2改为:Text.Contains([metadata], "\b" & id & "\b", [Comparer=Comparer.OrdinalIgnoreCase])
内容的提问来源于stack exchange,提问作者dimmerz
相关产品推荐
相关产品推荐

