Power Query - 合并查询返回 true 或 false

Posted

技术标签:

【中文标题】Power Query - 合并查询返回 true 或 false【英文标题】:Power Query - Merge queries returns true or false 【发布时间】:2019-03-09 09:55:13 【问题描述】:

我想知道如果 2 个查询之间的合并匹配数据,M 语言是否可以只返回 True 或 False ?

或多或少,类似于 Excel 中用于函数 VLOOKUP 的 ISNA 函数

谢谢

【问题讨论】:

您的更广泛目标是什么?也就是说,你用真假信息做什么? 【参考方案1】:

认为这可能会提供您想要的,特别是使用合并:

如果我从来自两个不同查询的两个表开始(我的查询名为 Query1 和 Query2):

如果我想查看哪些 Query2 不在 Query1 中,我点击 Home > Merge Queries > 然后我设置这样的对话框并点击 OK:

这给了我这个:

然后我通过单击列右上角的来展开 Query2 列中的表以获得以下信息:

然后我点击编辑栏左侧的,在编辑栏中输入= Table.TransformColumns(#"Expanded Query2", "Column1.1", each if _ = null then false else true),然后点击回车得到这个:

(如果您查看屏幕右侧的 Applied Steps 下方,您会看到 Expanded Query2 是上一步。每个步骤也恰好是一个表格状态,就像查询结果是表状态一样。您可以将这些表状态用作表,就像将查询结果用作表一样...因为它们基本上是表。此代码将列从先前的表状态转换。此外,如果您没有看到公式栏,请单击“查看”选项卡并选中“公式栏”框。)

*****在@Frederic Le Guen 的评论后添加*****

这是使用 List.Contains 的一种更直接的方式,它可能更符合您的要求。

从我上面所做的两个查询中的相同两个表开始,查询名为 Query1 和 Query1 和 Query2:

进入 Query1 并向其中添加一列 -- 添加列 > 自定义列 -- 并像这样设置它:

然后点击确定。

你会得到这个:

【讨论】:

是的,谢谢,但我认为可以用更少的步骤达到相同的结果。如果不可能,解决方案很有趣 如果您查看 List 函数,您可能会发现更适合您真正最终目标的内容。 我已经尝试过类似List.IsEmpty(List.FindText(myList, "string")) 的函数,但它是一个非常慢的函数。所以我试图找到更好的方法 我在回答的最后添加了另一种可能更符合您的要求的方式。它使用 List.Contains。 我的 List.Contains 示例与@Chillin 的方法 1 基本相同。【参考方案2】:

假设我想检查此表中的哪些值 ("firstTable"):

存在于下表中("secondTable"):

方法 1

如果您只想检查是否存在(而不是实际执行合并),那么这可能是一种方法:

let
    firstTable = Table.FromColumns(List.Numbers(1,10,1), type table [column A=Int64.Type]),
    secondTable = Table.FromColumns(List.Numbers(1,10,2), type table [column B=Int64.Type]),
    check = Table.AddColumn(firstTable, "Is column A in column B?", each Table.Contains(secondTable, [column B = [column A]]), type logical)
in
    check

方法 2

类似但更冗长的方法可能是:

let
    firstTable = Table.FromColumns(List.Numbers(1,10,1), type table [column A=Int64.Type]),
    secondTable = Table.FromColumns(List.Numbers(1,10,2), type table [column B=Int64.Type]),
    check = Table.AddColumn(firstTable, "Is column A in column B?", each let colA = [column A], lookup = Table.MatchesAnyRows(secondTable, each [column B] = colA) in lookup, type logical)
in
    check

方法 3

这种方法实际上会执行合并,然后检查每个合并/连接的表是否包含任何行。我想它会比其他的慢(理论上它会尝试合并/匹配所有行并且一旦找到一个匹配项就不会退出),但我可能错了,这取决于Table.Join' s 内部实现。

let
    firstTable = Table.FromColumns(List.Numbers(1,10,1), type table [column A=Int64.Type]),
    secondTable = Table.FromColumns(List.Numbers(1,10,2), type table [column B=Int64.Type]),
    merged = Table.NestedJoin(firstTable, "column A", secondTable, "column B", "Is column A in the second table?", JoinKind.LeftOuter),
    isEmpty = Table.TransformColumns(merged, "Is column A in the second table?", Table.IsEmpty, type logical)
in
    isEmpty 

我给出了三种方法,因为您没有展示您的数据/示例。很难建议什么会运作良好。但希望您可以尝试它们,其中一种对您的数据大小有用/有效。

注意前两行(每个M sn-p)只是为了创建一些虚拟表firstTablesecondTable

【讨论】:

以上是关于Power Query - 合并查询返回 true 或 false的主要内容,如果未能解决你的问题,请参考以下文章

为啥power query合并查询中的右反查询出来的结果为空

Power Query:如何使电源查询更新合并文件?

Power Query 同一文件夹多工作簿合并

Excel Power Query;如何合并值并转动问题

在一个 Power Query 中合并多个工作簿中的相同选项卡

Power Query初识