You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的查询界面:

  1. 点击「添加列」→「自定义列」,输入公式:fn_MatchTable2(_, Table2)(Table2替换为你的实际表2名称),点击确定后会生成包含匹配行列表的自定义列。
  2. 点击自定义列右侧的展开按钮,选择需要保留的表2字段(如date、metadata、ID),选择「展开到新行」(若一个表1行匹配多个表2行,会拆分为多行;如需合并为一行可选择「合并值」,按需调整)。
  3. 最后调整列顺序、删除冗余列,即可得到最终左连接结果。

补充说明

  • 默认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:43:01