Applies to: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
A let
statement is used to set a variable name equal to an expression or a function, or to create views.
let
ステートメントは、次の場合に役立ちます。
- 複雑な式を、それぞれが変数によって表される複数の部分に分割する。
- 読みやすくするため、クエリ本体の外部で定数を定義する。
- 変数を一度定義し、1 つのクエリ内で複数回それを使用する。
入れ子になったステートメントなど、変数が前に別の値を表していた場合は、最も内側の let
ステートメントが適用されます。
1 つのクエリ内での let
ステートメントの複数使用を最適化するには、「名前付き式を使用するクエリを最適化する」を参照してください。
Note
let
ステートメントは、その計算の評価値ではなく、名前を計算にバインドします。 この動作は、計算が複数回評価されるため、同じ名前への複数の参照が異なる値を返す可能性があることを意味します。 If this is not the desired behavior, use toscalar() or materialize().
構文: スカラーまたは表形式の式
let
Name=
Expression
Important
let ステートメントの後には、セミコロンを付ける必要があります。 let ステートメントの間、または let ステートメントと他のクエリ ステートメントの間には、空白行を指定することはできません。
Learn more about syntax conventions.
Parameters
Name | タイプ | Required | Description |
---|---|---|---|
Name | string |
✔️ | 変数名。 名前は角かっこでエスケープできます。 たとえば、「 ["Name with spaces"] 」のように入力します。 |
Expression | string |
✔️ | スカラーまたは表形式の結果を含む式。 たとえば、スカラーの結果を含む式は let one=1; となり、表形式の結果を含む式は let RecentLog = Logs | where Timestamp > ago(1h) となります。 |
構文: ビューまたは関数
let
Name=
[view
] (
[ Parameters ])
{
FunctionBody}
Important
let ステートメントの後には、セミコロンを付ける必要があります。 let ステートメントの間、または let ステートメントと他のクエリ ステートメントの間には、空白行を指定することはできません。
Learn more about syntax conventions.
Parameters
Name | タイプ | Required | Description |
---|---|---|---|
FunctionBody | string |
✔️ | ユーザー定義関数を生成する式。 |
view |
string |
パラメーターのない let ステートメントにのみ関連します。 使用すると、let ステートメントは、union 演算子とテーブルまたはビューのワイルドカード選択が使用されているクエリに含められます。 例については、「ビューまたは仮想テーブルを作成する」を参照してください。 |
|
Parameters | string |
0 個以上のコンマ区切りの表形式またはスカラー関数のパラメーター。 For each parameter of tabular type, the parameter should be in the format TableName : TableSchema, in which TableSchema is either a comma-separated list of columns in the format ColumnName: ColumnType or a wildcard (* ). 列が指定されている場合は、入力の表形式引数にこれらの列が含まれている必要があります。 ワイルドカードが指定されている場合、入力の表形式引数には任意のスキーマを指定できます。 関数本体の列を参照するには、列を指定する必要があります。 例については、「スキーマを使用した表形式の引数」と「ワイルドカードを使用した表形式の引数」を参照してください。For each parameter of scalar type, provide the parameter name and parameter type in the format Name : Type. The name can appear in the FunctionBody and is bound to a particular value when the user defined function is invoked. サポートされている型は、bool 、string 、long 、datetime 、timespan 、real 、dynamic 、およびこれらの型の別名のみです。 |
Note
- 表形式パラメーターは、スカラー パラメーターの前に指定する必要があります。
- 2 つのステートメントは、セミコロンで区切る必要があります。
Examples
クエリの例は、演算子、ステートメント、または関数の構文と使用例を示しています。
The examples in this article use publicly available tables in the help cluster, such as the
StormEvents
table in the Samples database.
The examples in this article use publicly available tables, such as the
Weather
table in the Weather analytics sample gallery. ワークスペース内のテーブルと一致するように、クエリ例のテーブル名を変更する必要がある場合があります。
スカラー値を定義する
次の例では、スカラー式のステートメントを使用しています。
let threshold = 50;
let region = "West";
datatable(Name:string, Score:int, Region:string)
[
"Alice", 45, "West",
"Bob", 60, "East",
"Charlie", 55, "West",
"Dana", 70, "North"
]
| where Score > threshold and Region == region
Output
Name | Score | Region |
---|---|---|
Charlie | 55 | West |
表形式の式を定義する
次の例では、some number
の概念を使用して名前 ['name']
をバインドした後、表形式の式のステートメントでそれを使用します。
let ['some number'] = 20;
range y from 0 to ['some number'] step 5
Output
y |
---|
0 |
5 |
10 |
15 |
20 |
スカラー計算を使用してユーザー定義関数を作成する
この例では、スカラー計算の引数で let ステートメントを使用します。 2 つの数値を乗算する関数 MultiplyByN
をクエリで定義します。
let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1
| extend result = MultiplyByN(x, 5)
Output
x | result |
---|---|
1 | 5 |
2 | 10 |
3 | 15 |
4 | 20 |
5 | 25 |
入力をトリミングするユーザー定義関数を作成する
次の例では、入力の先頭と末尾から 1 を削除します。
let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1
| extend result = TrimOnes(tostring(x))
Output
x | result |
---|---|
10 | 0 |
11 | |
12 | 2 |
13 | 3 |
14 | 4 |
15 | 5 |
複数の let ステートメントを使用する
この例では、2 つの 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
Output
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
Output
$table | MyColumn |
---|---|
Range10 | 5 |
Range20 | 5 |
materialize 関数を使用する
materialize()
関数を使用すると、クエリの実行時に、サブクエリの結果をキャッシュすることができます。
materialize()
関数を使用すると、データがキャッシュされ、その後の結果の呼び出しではキャッシュされたデータが使用されます。
let TotalEventsbyLocation = StormEvents
| summarize TotalCount = count() by Location = BeginLocation;
let materializedScope = StormEvents
| summarize by EventType, Location = EndLocation;
let cachedResult = materialize(materializedScope);
cachedResult
| project EventType, Location
| join kind = inner
(
cachedResult
| project EventType, Location
)
on EventType
| where Location != ""
| summarize EventCount = count() by Location
| join kind = inner
TotalEventsbyLocation
on $left.Location == $right.Location
| project Location, EventCount, TotalCount, Percentage = EventCount * 100.0 / TotalCount
Output
Location | EventCount | TotalCount | Percentage |
---|---|---|---|
MELBOURNE BEACH | 112 | 1 | 11,200 |
EUSTIS | 13,854 | 12 | 115,450 |
LOTTS | 6,910 | 1 | 691,000 |
SERVICE | 997 | 1 | 99,700 |
... | ... | ... | ... |
入れ子になった let ステートメントの使用
ユーザー定義関数式の中も含めて、入れ子になった let ステートメントを使用できます。 let ステートメントと引数は、関数本体の現在のスコープと内部のスコープの両方に適用されます。
let start_time = ago(5h);
let end_time = start_time + 2h;
T | where Time > start_time and Time < end_time | ...
スキーマを使用した表形式の引数
次の例では、表パラメーター T
に State
型の列 string
が必要であることを指定しています。 表 T
には他の列も含めることができますが、宣言されていないため、関数 StateState
で参照することはできません。
let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s
Output
State | s_s |
---|---|
ATLANTIC SOUTH | 大西洋南大西洋南部 |
FLORIDA | FLORIDAFLORIDA |
FLORIDA | FLORIDAFLORIDA |
GEORGIA | GEORGIAGEORGIA |
MISSISSIPPI | MISSISSIPPIMISSISSIPPI |
... | ... |
ワイルドカードを使用した表形式の引数
表パラメーター T
には任意のスキーマを指定でき、関数 CountRecordsInTable
は機能します。
let CountRecordsInTable=(T: (*)) { T | count };
StormEvents | invoke CountRecordsInTable()
Output
Count |
---|
59,066 |