了解 Power Query M 函式

在 Power Query M 公式語言中,函式是從一組輸入值到單一輸出值的對應。 函式的撰寫方式是先命名函式參數,然後提供運算式來計算函式的結果。 函式的主體會跟在前往 (=>) 符號之後。 可以在參數和函式的傳回值上包含選擇性的類型資訊。 函式會在 let 陳述式的主體中進行定義和叫用。 參數和/或傳回值可以是隱含或明確。 隱含參數和/或傳回值的類型是 anyany 類型與其他語言中的 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"