表达式、值和 let 表达式

Power Query M 公式语言查询由创建糅合查询的公式“表达式”步骤组成。 可以对公式表达式求值(计算),然后得到一个值。 “let”表达式封装一组要计算、分配名称的值,然后在“in”语句后面的后续表达式中使用。 例如,let 表达式可能包含一个“源”变量,该变量等于 Text.Proper 的值,并以正确的大小写生成文本值

Let 表达式

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

在上面的示例中,Text.Proper("hello world") 的结果为 "Hello World"

下一节介绍语言中的值类型。

基元值

“基元”值是单个部分值,如数字、逻辑、文本或 NULL 。 NULL 值可用于指示缺少数据。

类型 示例值
二进制 00 00 00 02 // 点数 (2)
日期 2015/5/23
DateTime 2015/5/23 凌晨 12:00:00
时区 2015/5/23 凌晨 12:00:00 到上午 08:00
持续时间 15:35:00
逻辑 true 和 false
Null NULL
数字 0、1、-1、1.5 和 2.3e-5
文本 “abc”
时间 下午 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 值。 要查看其他示例,请转到其他结构化数据示例

列出

列表是用大括号字符 { } 括起来的从零开始的有序值序列。 大括号字符 { } 还用于按索引位置检索列表中的项。 有关详细信息,请转到列表值

注意

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。

  • #“标识符名称”,如 #“今天的数据为:”。

下面是一个记录,其中包含名为“OrderID”、“CustomerID”、“项”和“价格”的字段,其值为 1、1、“钓鱼竿”和 100.00。 方括号字符 [ ] 表示记录表达式的开始和结束,用于从记录中获取字段值。 下面的示例演示了一个记录以及如何获取项字段值。

下面是一个示例记录:

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

若要获取项的值,请依照 Source[Item] 这样使用方括号:

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

“表”是一组按命名的列和行组织的值。 列类型可以是隐式或显式的。 可以使用 #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 钓鱼竿 100.00
2 1 1 磅蠕虫 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 磅蠕虫
价格 5

其他结构化数据示例

结构化数据可包含任何 M 值。 下面是一些示例:

示例 1 - List with [Primitive](#_Primitive_value_1) values, [Function](#_Function_value), and [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

此表达式的计算过程可以直观表示为:

使用基元值、函数和记录可视化表达式的表示意图。

示例 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

此表达式的计算过程可以直观表示为:

使用多个基元值和嵌套记录可视化表达式的表示意图。

注意

尽管许多值都可以按字面形式写成表达式,但值不是表达式。 例如,表达式 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) 的结果