Let 陳述式

let語句用來設定等於表達式或函式的變數名稱,或建立檢視表。

let 陳述式適用於:

  • 將複雜運算式分解成多個部分,每個部分都以變數表示。
  • 在查詢主體之外定義常數,可獲得可讀性。
  • 定義變數一次,並在查詢內使用其多次。

如果該變數先前代表另一個值 (例如在巢狀陳述式中),則會套用最內層的 let 陳述式。

若要在單一查詢中優化語句的 let 多個用法,請參閱 優化使用具名表達式的查詢

注意

語句 let 會將名稱系結至計算,而不是該計算的評估值。 此行為表示同名的多個參考可能會因為多次評估計算而傳回不同的值。 如果這不是所需的行為,請使用 toscalar () materialize ()

語法:純量或表格式表達式

let名字=表達

重要

Let 語句後面必須加上分號。 let 語句之間或 let 語句與其他查詢語句之間不能有任何空白行。

深入瞭解 語法慣例

參數

名稱 類型 必要 描述
名稱 string ✔️ 變數名稱。 您可以使用方括弧逸出名稱。 例如: ["Name with spaces"]
運算式 string ✔️ 具有純量或表格式結果的表達式。 例如,具有純量結果的運算式會是 let one=1;,而具有表格式結果的運算式會是 let RecentLog = Logs | where Timestamp > ago(1h)

語法:檢視或函式

let名字= [view] ([ 參數 ]){FunctionBody}

重要

Let 語句後面必須加上分號。 let 語句之間或 let 語句與其他查詢語句之間不能有任何空白行。

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
FunctionBody string ✔️ 產生使用者定義函數的表達式。
view string 僅與無 let 參數語句相關。 如果使用,則 let 陳述式會包含在使用 union 運算子搭配資料表/檢視的萬用字元選項的查詢中。 如需範例,請參閱 建立檢視或虛擬數據表
參數 string 零個或多個逗號分隔表格式或純量函數參數。

對於表格式類型的每個參數,參數的格式應該是 TableNameTableSchema,其中 TableSchemaColumnName::ColumnType 格式的逗號分隔數據行清單,或是通配符 () * 。 如果指定數據行,則輸入表格式自變數必須包含這些數據行。 如果指定通配符,則輸入表格式自變數可以有任何架構。 若要參考函式主體中的數據行,必須指定它們。 如需範例,請參閱具有架構的表格式自變數和具有通配符的表格式自變數

針對純量類型的每個參數,請以名稱類型格式:提供參數名稱和參數類型。 名稱可以出現在 FunctionBody 中,並在叫用使用者定義函數時系結至特定值。 唯一支援的型別為 boolstringlong、、realdatetimetimespan、、 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

輸出

結果
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() 式時,會快取數據,而結果的任何後續調用都會使用快取的數據。

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

具有架構的表格式自變數

下列範例會指定 table 參數T必須具有 類型的string數據行State。 資料表 T 也可能包含其他資料行,但無法參考函式中 StateState ,因為 未宣告 。

let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s

輸出

State s_s
大西洋南部 南亞蘭特南
佛羅里達州 一起
佛羅里達州 一起
喬治亞州 喬治亞GEORGIA
密西西比州 MISSISSIPPIMISSISSIPPI
... ...

含通配符的表格式自變數

數據表參數 T 可以有任何架構,而且函式 CountRecordsInTable 將會運作。

let CountRecordsInTable=(T: (*)) { T | count };
StormEvents | invoke CountRecordsInTable()

輸出

Count
59,066