【问题标题】:Conditional Column: Order of Tests Matters?条件列:测试顺序很重要?
【发布时间】:2022-10-05 02:00:24
【问题描述】:

测试日期的条件

我正在使用 Power Query 创建一个状态列,用于根据指定日期检查日期,如下所示:

但是,这给了我以下错误:

Expression.Error: We cannot convert the value null to type Logical.
Details:
    Value=
    Type=[Type]

该列确实包含空单元格,我想在新列中将其报告为“null”。然后我尝试了以下逻辑,它也出错了:

然后我将空测试移到顶部,它终于可以工作了:

为什么订单很重要?

为什么第三个查询会产生预期的结果,而不是第一个?这对我来说似乎很奇怪,所以如果我遗漏了什么,请告诉我。

【问题讨论】:

  • 您也可以将您的公式包装在尝试中...否则..,但@david 有真正的答案

标签: excel powerquery


【解决方案1】:

M 在 if 语句中使用惰性求值。如果第一条语句为真,那么它甚至不会费心评估其他条件。

https://learn.microsoft.com/en-us/powerquery-m/m-spec-introduction

对于计算机语言理论家:指定的公式语言 这份文件大部分是纯粹的、高阶的、动态类型的, 部分惰性函数式语言。

【讨论】:

    【解决方案2】:

    轻松修复

    在过滤器之前的步骤中,选择“删除空值”或“用值替换空值”

    使用catch

    如果您想要更大的灵活性,可以使用try + catch 对。 步骤FirstTry 的意思是;成为您的过滤器,然后我添加了两种处理错误的方法。

    let
        Source = Table.FromList(sample, Splitter.SplitByNothing(),
            type table[Date = nullable date], null, ExtraValues.Error),
    
        sample = {
            #date(2020, 1, 1),
            "text", null,
            #date(2024, 1, 1)
        },
        filter = #date(2022, 1, 1),
    
        FirstTry = Table.AddColumn(
            Source , "Comparison", each filter > [Date], Logical.Type),
    
        WithFallback = Table.AddColumn(FirstTry, "WithFallback",
            each try
                filter > [Date]
                catch (e) => e[Message], type text),
        
        WithPreservedDatatype = Table.AddColumn(WithFallback, "PreserveColumnType",
            each try
                filter > [Date]
                catch (e) => null meta [ Reason = e[Message] ],
                type logical)
    in
        WithPreservedDatatype
    

    注意事项

    • 查询步骤“乱序”,完全有效。 (上面的sample 在它的行“之前”被引用)
    • Errors are propagated 所以第 4 步的错误实际上可能是第 2 步。一直往上走,直到找到为止。
    • schema 表示列[Date]date 类型——但它实际上是type any

    您需要拨打Table.TransformColumnTypes转换和断言数据类型

    = Table.TransformColumnTypes( Source,{{"Date", type date}})
    

    现在行2 将正确显示错误,因为text 无法转换为date

    【讨论】:

      【解决方案3】:

      更好地理解 NULL

      我不了解 Excel(或任何其他数据工具)如何处理空值以及如何对空值执行逻辑测试。 Reddit 上的这个回应确实帮助我澄清了这一点:

      https://www.reddit.com/r/excel/comments/xu37dr/comment/iqtmivn/?utm_source=share&utm_medium=web2x&context=3

      简而言之,涉及空值的逻辑测试不会像您期望的那样表现。

      要更深入地了解这一点,请阅读这篇出色的文章:

      https://bengribaudo.com/blog/2018/09/13/4617/power-query-m-primer-part9-types-logical-null-binary

      我的解决方案

      鉴于对空值的这种开明理解,我现在知道我要么:

      1. 必须将空值转换为空字符串 ("")
      2. 首先测试查询中的空值

        我的选择是首先测试空值,如下所示:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多