Let 语句
使用 let
语句设置与表达式或函数同名的变量名称,或创建视图。
let
语句可用于:
- 将复杂表达式分解为多个部分,每个部分由变量表示。
- 定义查询正文外部的常量,以提高可读性。
- 定义变量一次,即可在查询中多次使用。
例如,如果变量以前在嵌套语句中表示另一个值,则会应用最里面的 let
语句。
若要在单个查询中优化 let
语句的多次使用,请参阅优化使用命名表达式的查询。
语法:标量表达式或表格表达式
let
Name=
ScalarExpression
let
Name=
TabularExpression
参数
参数 | 说明 | 示例 |
---|---|---|
名称 | 变量名称必须有效。 | 可以转义名称,例如 ["Name with spaces"] |
ScalarExpression | 具有标量结果的表达式。 | let one=1; |
TabularExpression | 具有表格结果的表达式。 | let RecentLog = Logs \| where Timestamp > ago(1h) |
语法:视图或函数
let
Name=
[view
] (
[TabularArgName:
(
*
)
,
[ArgName:
ArgType ],
... ] )
{
FunctionBody}
let
Name=
[view
] (
[ [TabularArgName:
(
[AttributeName:
AttributeType] [,
... ] )
] ,
[ [ArgName:
ArgType , ...] ] )
{
FunctionBody `}
参数
参数 | 说明 |
---|---|
FunctionBody | 生成用户定义函数的表达式。 |
view | 仅出现在没有参数的无参数 let 语句中。 使用时,let 语句包含在带有 union 运算符的查询中,该运算符具有表/视图的通配符选择。 |
TabularArgName | 表格参数的名称。 可以出现在 FunctionBody 中,并在调用用户定义的函数时绑定到特定值。 |
AttributeName:AttributeType | 属性的名称和类型。 表架构定义的一部分,其中包括一组属性及其类型。 |
ArgName | 标量参数的名称。 可以出现在 FunctionBody 中,并在调用用户定义的函数时绑定到特定值。 |
ArgType | 标量参数的类型。 目前,用户定义的函数支持以下各项:bool 、string 、long 、datetime 、timespan 、real 和 dynamic (和这些类型的别名)。 |
注意
- 可将
(*)
用于表格表达式。 - 使用表格表达式作为用户定义函数的一部分时,列不能作为函数的一部分访问。
- 表格参数显示在标量参数之前。
- 必须用分号分隔任意两个语句。
示例
定义标量值
下面的示例使用标量表达式语句。
let n = 10; // number
let place = "Dallas"; // string
let cutoff = ago(62d); // datetime
Events
| where timestamp > cutoff
and city == place
| take n
以下示例使用 ['name']
表示法绑定名称 some number
,然后在表格表达式语句中使用它。
let ['some number'] = 20;
range y from 0 to ['some number'] step 5
使用标量计算创建用户定义函数
此示例使用带有自变量的 let 语句进行标量计算。 该查询定义了用于将两个数字相乘的函数 MultiplyByN
。
let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1
| extend result = MultiplyByN(x, 5)
输出
x | result |
---|---|
1 | 5 |
2 | 10 |
3 | 15 |
4 | 20 |
5 | 25 |
创建用于剪裁输入的用户定义函数
以下示例删除输入中的前导/尾随空格。
let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1
| extend result = TrimOnes(tostring(x))
输出
x | result |
---|---|
10 | 0 |
11 | |
12 | 2 |
13 | 3 |
14 | 4 |
15 | 5 |
使用多个 let 语句
此示例定义了两个 let 语句,其中一个语句 (foo2
) 使用另一个语句 (foo1
)。
let foo1 = (_start:long, _end:long, _step:long) { range x from _start to _end step _step};
let foo2 = (_step:long) { foo1(1, 100, _step)};
foo2(2) | count
输出
result |
---|
50 |
创建视图或虚拟表
此示例演示如何使用 let 语句创建 view
或虚拟表。
let Range10 = view () { range MyColumn from 1 to 10 step 1 };
let Range20 = view () { range MyColumn from 1 to 20 step 1 };
search MyColumn == 5
输出
$table | MyColumn |
---|---|
Range10 | 5 |
Range20 | 5 |
使用 materialize 函数
materialize()
函数允许在执行查询时缓存子查询结果。 使用 materialize()
函数时,将缓存数据,任何后续的结果调用都使用缓存数据。
let totalPagesPerDay = PageViews
| summarize by Page, Day = startofday(Timestamp)
| summarize count() by Day;
let materializedScope = PageViews
| summarize by Page, Day = startofday(Timestamp);
let cachedResult = materialize(materializedScope);
cachedResult
| project Page, Day1 = Day
| join kind = inner
(
cachedResult
| project Page, Day2 = Day
)
on Page
| where Day2 > Day1
| summarize count() by Day1, Day2
| join kind = inner
totalPagesPerDay
on $left.Day1 == $right.Day
| project Day1, Day2, Percentage = count_*100.0/count_1
输出
第 1 天 | 第 2 天 | 百分比 |
---|---|---|
2016-05-01 00:00:00.0000000 | 2016-05-02 00:00:00.0000000 | 34.0645725975255 |
2016-05-01 00:00:00.0000000 | 2016-05-03 00:00:00.0000000 | 16.618368960101 |
2016-05-02 00:00:00.0000000 | 2016-05-03 00:00:00.0000000 | 14.6291376489636 |
使用嵌套的 let 语句
允许使用嵌套的 let 语句,包括在用户定义函数表达式中。 let 语句和自变量适用于函数主体的当前作用域和内部作用域。
let start_time = ago(5h);
let end_time = start_time + 2h;
T | where Time > start_time and Time < end_time | ...