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 中,並在叫用使用者定義函數時系結至特定值。 唯一支援的型別為 bool 、string 、、datetime long 、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()
式時,會快取數據,而結果的任何後續調用都會使用快取的數據。
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 |