Let 语句

使用 let 语句设置与表达式或函数同名的变量名称,或创建视图

let 语句可用于:

  • 将复杂表达式分解为多个部分,每个部分由变量表示。
  • 定义查询正文外部的常量,以提高可读性。
  • 定义变量一次,即可在查询中多次使用。

例如,如果变量以前在嵌套语句中表示另一个值,则会应用最里面的 let 语句。

语法

标量或表格表达式的语法

letName=ScalarExpression

letName=TabularExpression

字段 定义 示例
名称 变量名称,必须有效。 可以转义名称,例如 ["Name with spaces"]
ScalarExpression 具有标量结果的表达式。 let one=1;
TabularExpression 具有表格结果的表达式。 let RecentLog = Logs \| where Timestamp > ago(1h)

视图或函数的语法

letName= [view] ( [TabularArgName:(*), [ArgName:ArgType ], ... ] ){FunctionBody}

letName= [view] ( [ [TabularArgName:([AttributeName:AttributeType] [, ... ] ) ] , [ [ArgName:ArgType , ...] ] ){FunctionBody `}

字段 定义
FunctionBody 生成用户定义函数(匿名函数声明)的表达式。
view 仅出现在没有参数的无参数 let 语句中。 使用时,let 语句包含在带有 union 运算符的查询中,该运算符具有表/视图的通配符选择。
TabularArgName 表格参数的名称。 可以出现在 FunctionBody 中,并在调用用户定义的函数时绑定到特定值。
AttributeName : AttributeType 属性的名称和类型。 表架构定义的一部分,其中包括一组属性及其类型。
ArgName 标量参数的名称。 可以出现在 FunctionBody 中,并在调用用户定义的函数时绑定到特定值。
ArgType 标量参数的类型。 目前,用户定义的函数支持以下各项:boolstringlongdatetimetimespanrealdynamic(和这些类型的别名)。

注意

  • 可将 (*) 用于表格表达式。
  • 使用表格表达式作为用户定义函数的一部分时,列不能作为函数的一部分访问。
  • 表格参数显示在标量参数之前。
  • 必须用分号分隔任意两个语句。

示例

定义标量值

下面的示例使用标量表达式语句。


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 | ...