了解 Power Query M 函数

在 Power Query M 公式语言中,函数是一组输入值到单个输出值的映射。 要编写一个函数,首先需命名函数参数,然后提供一个表达式来计算函数的结果。 函数正文在“转到”(=>) 符号之后。 根据需要,类型信息可以包含在参数和函数返回值中。 函数在 let 语句的正文中定义和调用。 参数和/或返回值可以是隐式或显式。 隐式参数和/或返回值属于 any 类型。 any 类型类似于其他语言中的 object 类型。 M 中的所有类型都派生自 any 类型

函数是与数字或文本值类似的值,并且可以像其他任何表达式一样通过嵌入的方式包含在内。 以下示例演示一个函数,该函数是随后将从其他几个变量调用或执行的 Add 变量的值。 调用函数时,将指定一组值,这些值会在逻辑上替换函数正文表达式中所需的输入值集。

示例 - 显式参数和返回值

let  
    AddOne = (x as number) as number => x + 1,  
    //additional expression steps  
    CalcAddOne = AddOne(5)  
in  
    CalcAddOne  

示例 - 隐式参数和返回值

let  
    Add = (x, y) => x + y,  
    AddResults =   
        [  
            OnePlusOne = Add(1, 1),     // equals 2  
            OnePlusTwo = Add(1, 2)      // equals 3  
    ]  
in  
    AddResults  

查找列表中大于 5 的第一个元素,否则返回 NULL

let  
    FirstGreaterThan5 = (list) =>   
        let   
            GreaterThan5 = List.Select(list, (n) => n> 5),  
            First = List.First(GreaterThan5)  
        in  
            First,  
    Results =   
    [  
            Found    = FirstGreaterThan5({3,7,9}),  // equals 7  
            NotFound = FirstGreaterThan5({1,3,4})   // equals null  
    ]  
in  
    Results  

函数可以以递归方式使用。 若要以递归方式引用函数,请在标识符前面加上 @。

let   
    fact = (num) => if num = 0 then 1 else num * @fact (num-1)   
in   
    fact(5) // equals 120  

Each 关键字

Each 关键字用于轻松创建简单函数。 “each ...”是采用 _ 参数“(_) => ...”的函数签名的语法糖

与默认应用于 _ 的查询运算符结合使用时,Each 非常有用
例如,每个 [CustomerID] 与每个 _[CustomerID] 相同,后者与 (_) => _[CustomerID] 相同

示例 - 在表行筛选器中使用 each

Table.SelectRows(  
      Table.FromRecords({  
            [CustomerID = 1, Name = "Bob", Phone = "123-4567"],  
            [CustomerID = 2, Name = "Jim", Phone = "987-6543"] ,  
            [CustomerID = 3, Name = "Paul", Phone = "543-7890"] ,  
            [CustomerID = 4, Name = "Ringo", Phone = "232-1550"]  
      }),   
      each [CustomerID] = 2  
)[Name]  
  
// equals "Jim"