運算式、值與 let 運算式

Power Query M 公式語言查詢是由建立混搭查詢的公式運算式步驟組成。 公式運算式可進行評估 (計算),並提供值。 let 運算式會封裝要計算的一組值、指派名稱,然後在 in 陳述式的後續運算式中使用。 例如,let 運算式可能會包含一個 Source 變數,與 Text.Proper() 的值相等,並產生適當大小寫的文字值。

Let 運算式

let
    Source = Text.Proper("hello world")
in
    Source

在上述範例中,Text.Proper("hello world") 會評估為 "Hello World"。

下一節會描述語言中的實值型別。

基本值

基本值是只有一個部分的值,例如數字、邏輯、文字或 null。 null 值可以用來表示沒有任何資料。

類型 範例值
二進位 00 00 00 02 // 點的數量 (2)
Date 5/23/2015
Datetime 2015 年 5 月 23 日 上午 12:00:00
DateTimeZone 2015 年 5 月 23 日 上午 12:00:00 -08:00
持續時間 15:35:00
邏輯 true 與 false
Null null
數值 0、1、-1、1.5 和 2.3e-5
Text "abc"
Time 下午 12:34:12

函式值

「函式」是一個值,其會在使用引數叫用函式時,產生新的值。 函式撰寫方式是在括弧中列出函式的參數,其後跟隨前往符號 =>,之後則是定義函式的運算式。 例如,建立稱為 "MyFunction" 的函式,其包含兩個參數,並會在 parameter1 和 parameter2 上執行計算:

let
    MyFunction = (parameter1, parameter2) => (parameter1 + parameter2) / 2
in
    MyFunction

呼叫 MyFunction() 會傳回結果:

let
    Source = MyFunction(2, 4)
in
    Source

此程式碼會產生值 3。

結構化資料值

M 語言支援下列結構化資料值:

注意

結構化資料可以包含任何 M 值。 若要查看數個範例,請參閱其他結構化資料範例

清單

清單是以零為基礎的數列,以大括弧字元 { } 括住。 大括弧字元 {} 也會用來根據索引位置來擷取清單中的項目。 請參閱 [清單值](#_List_value)。

注意

Power Query M 支援無限的清單大小,但若清單是以常值的方式撰寫,則會有固定長度。 例如,{1, 2, 3} 的固定長度為 3。

下列是一些清單範例。

類型
{123, true, "A"} 包含數字、邏輯和文字的清單。
{1, 2, 3} 數字清單
{
    {1, 2, 3},
    {4, 5, 6}
}
數字清單的清單
{
    [CustomerID = 1, Name = "Bob", Phone = "123-4567"],
    [CustomerID = 2, Name = "Jim", Phone = "987-6543"]
}
記錄清單
{123, true, "A"}{0} 取得清單中第一個項目的值。 這個運算式會傳回值 123。
{
    {1, 2, 3},
    {4, 5, 6}
}{0}{1}
從第一個清單項目取得第二個項目的值。 這個運算式會傳回值 2。

記錄

記錄是一組欄位。 欄位是一種名稱值對,其中名稱是欄位記錄中唯一的文字值。 記錄值語法允許在不使用引號的情況下撰寫名稱,此形式也稱為識別項。 識別項可以採用下列兩種形式:

  • identifier_name,例如 OrderID。

  • #"識別項名稱",例如 #"Today's data is: "。

下列是一筆記錄,其包含名為 "OrderID"、"CustomerID"、"Item" 和 "Price" 的欄位,其值則分別為 1、1、"Fishing rod" 和 "100.00"。 方括弧字元 [ ] 則表示記錄運算式的開頭和結尾,並會用來從記錄取得欄位值。 下列範例會顯示記錄及如何取得 Item 欄位值。

以下為範例記錄:

let Source =
        [
              OrderID = 1,
              CustomerID = 1,
              Item = "Fishing rod",
              Price = 100.00
        ]
in Source

若要取得 Item 的值,您可以使用方括弧,例如 Source[Item]:

let Source =
    [
          OrderID = 1,
          CustomerID = 1,
          Item = "Fishing rod",
          Price = 100.00
    ]
in Source[Item] //equals "Fishing rod"

Table

資料表是一組整理為具名資料行和資料列的值。 資料行類型可以是隱含或明確。 您可以使用 #table 來建立資料行名稱清單和資料列清單。 值的資料表是在一個清單中的清單。 大括弧字元 { } 也可以用來透過索引位置,從資料表擷取資料列 (請移至範例 3 ‒ 透過索引位置從資料表取得資料列)。

範例 1 - 使用隱含資料行類型建立資料表

let
  Source = #table(
    {"OrderID", "CustomerID", "Item", "Price"},
      {
          {1, 1, "Fishing rod", 100.00},
          {2, 1, "1 lb. worms", 5.00}
      })
in
    Source

範例 2 ‒ 使用明確資料行類型建立資料表

let
    Source = #table(
    type table [OrderID = number, CustomerID = number, Item = text, Price = number],
        {
                {1, 1, "Fishing rod", 100.00},
             {2, 1, "1 lb. worms", 5.00}
        }
    )
in
    Source

以上兩個範例都會建立包含下列圖形的資料表:

OrderID CustomerID 項目 價格
1 1 Fishing rod 100.00
2 1 1 lb. worms 5.00

範例 3 ‒ 透過索引位置從資料表取得資料列

let
    Source = #table(
    type table [OrderID = number, CustomerID = number, Item = text, Price = number],
        {
              {1, 1, "Fishing rod", 100.00},
              {2, 1, "1 lb. worms", 5.00}
         }
    )
in
    Source{1}

這個運算式會傳回下列記錄:

欄位
OrderID 2
CustomerID 1
項目 1 lb. worms
Price 5

其他結構化資料範例

結構化資料可以包含任何 M 值。 以下列出一些範例:

範例 1 - 包含 [Primitive](#_Primitive_value_1) 值、[Function](#_Function_value) 和 [Record](#_Record_value) 的清單

let
    Source =
{
   1,
   "Bob",
   DateTime.ToText(DateTime.LocalNow(), "yyyy-MM-dd"),
   [OrderID = 1, CustomerID = 1, Item = "Fishing rod", Price = 100.0]
}
in
    Source

評估此運算式的方式可以視覺化如下:

List Example 1

範例 2 - 包含基本值和巢狀記錄的記錄

let
    Source = [CustomerID = 1, Name = "Bob", Phone = "123-4567", Orders =
        {
              [OrderID = 1, CustomerID = 1, Item = "Fishing rod", Price = 100.0],
            [OrderID = 2, CustomerID = 1, Item = "1 lb. worms", Price = 5.0]
        }]
in
    Source

評估此運算式的方式可以視覺化如下:

List Example 2

注意

雖然許多值都可以直接在字面上撰寫成運算式,但值不是運算式。 例如,運算式 1 會評估為值 1,運算式 1+1 則會評估為值 2。 這種差異很輕微,但很重要。 運算式是評估的配方;值則是評估的結果。

If 運算式

if 運算式會根據邏輯條件,在兩個運算式之間進行選取。 例如:

if 2 > 1 then
    2 + 2
else
    1 + 1

若邏輯運算式 (2 > 1) 為 true,則會選取第一個運算式 (2 + 2);若為 false,則會選取第二個運算式 (1 + 1)。 選取的運算式 (在此案例中為 2 + 2) 會進行評估,並成為 if 運算式的結果 (4)。