共用方式為


Let 陳述式

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

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

let 語句適用於:

  • 將複雜表達式分割成多個部分,每個部分都由變數表示。
  • 定義查詢主體外部的常數以取得可讀性。
  • 定義變數一次,並在查詢內多次使用它。

如果變數先前代表另一個值,例如在巢狀語句中,則會套用最內部的 let 語句。

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

注意

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

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

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 語句與其他查詢語句之間不能有空白行。

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
FunctionBody string ✔️ 產生使用者定義函數的表達式。
view string 僅與無 let 參數語句相關。 使用時, let 語句會包含在具有數據表/檢視通配符選取的運算元查詢 union 中。 如需範例,請參閱 建立檢視或虛擬數據表
參數 string 零或多個逗號分隔表格式或純量函式參數。

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

針對純量類型的每個參數,以名稱:類型格式提供參數名稱和參數類型。 名稱可以出現在 FunctionBody,並在叫用使用者定義函數時系結至特定值。 唯一支援的型別為 boolstring、、datetimelongtimespanrealdynamic和這些類型的別名。

注意

  • 表格式參數必須出現在純量參數之前。
  • 任何兩個語句都必須以分號分隔。

範例

定義純量值

下列範例使用純量表達式語句。

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

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

輸出

Day1 Day2 百分比
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

輸出

州/省 s_s
大西洋南部 大西洋南大西洋南部
佛羅里達州 佛羅里達州FLORIDA
佛羅里達州 佛羅里達州FLORIDA
喬治亞州 佐治亞州
密西西比州 MISSISSIPPIMISSISSIPPI
... ...

具有通配符的表格式自變數

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

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

輸出

計數
59,066