表达式、值和 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) 的结果。