次の方法で共有


let ステートメント

適用対象: ✅Microsoft FabricAzure データ エクスプローラーAzure MonitorMicrosoft Sentinel

let ステートメントは、式または関数と等しい変数名を設定したり、viewsを作成したりするために使用されます。

let ステートメントは、次の場合に役立ちます。

  • 複雑な式を、それぞれが変数によって表される複数の部分に分割する。
  • 読みやすくするため、クエリ本体の外部で定数を定義する。
  • 変数を一度定義し、1 つのクエリ内で複数回それを使用する。

入れ子になったステートメントなど、変数が前に別の値を表していた場合は、最も内側の let ステートメントが適用されます。

1 つのクエリ内での let ステートメントの複数使用を最適化するには、「名前付き式を使用するクエリを最適化する」を参照してください。

Note

let ステートメントは、その計算の評価値ではなく、名前を計算にバインドします。 この動作は、計算が複数回評価されるため、同じ名前への複数の参照が異なる値を返す可能性があることを意味します。 これが望ましい動作でない場合は、 toscalar() または materialize()を使用します。

構文: スカラーまたは表形式の式

letName =Expression

重要

let ステートメントの後には、セミコロンを付ける必要があります。 let ステートメントの間、または let ステートメントと他のクエリ ステートメントの間には、空白行を指定することはできません。

構文規則について詳しく知る。

パラメーター

件名 タイプ Required 内容
名前 string ✔️ 変数名。 名前は角かっこでエスケープできます。 たとえば、「 ["Name with spaces"] 」のように入力します。
Expression string ✔️ スカラーまたは表形式の結果を含む式。 たとえば、スカラーの結果を含む式は let one=1; となり、表形式の結果を含む式は let RecentLog = Logs | where Timestamp > ago(1h) となります。

構文: ビューまたは関数

letName =[view] ([ Parameters ]) { FunctionBody }

重要

let ステートメントの後には、セミコロンを付ける必要があります。 let ステートメントの間、または let ステートメントと他のクエリ ステートメントの間には、空白行を指定することはできません。

構文規則について詳しく知る。

パラメーター

件名 タイプ Required 説明
FunctionBody string ✔️ ユーザー定義関数を生成する式。
view string パラメーターのない let ステートメントにのみ関連します。 使用すると、let ステートメントは、union 演算子とテーブルまたはビューのワイルドカード選択が使用されているクエリに含められます。 例については、「ビューまたは仮想テーブルを作成する」を参照してください。
パラメーター string 0 個以上のコンマ区切りの表形式またはスカラー関数のパラメーター。

表形式の各パラメーターについて、パラメーターは TableName:TableSchema 形式である必要があります。TableSchema は、ColumnName:ColumnType 形式の列のコンマ区切りリストまたはワイルドカード (*) です。 列が指定されている場合は、入力の表形式引数にこれらの列が含まれている必要があります。 ワイルドカードが指定されている場合、入力の表形式引数には任意のスキーマを指定できます。 関数本体の列を参照するには、列を指定する必要があります。 例については、「スキーマを使用した表形式の引数」と「ワイルドカードを使用した表形式の引数」を参照してください。

スカラー型の各パラメーターに対して、パラメーター名とパラメーター型を Name:Type の形式で指定します。 この名前は FunctionBody で使用でき、ユーザー定義関数が呼び出されると特定の値にバインドされます。 サポートされている型は、boolstringlongdatetimetimespanrealdynamic、およびこれらの型の別名のみです。

Note

  • 表形式パラメーターは、スカラー パラメーターの前に指定する必要があります。
  • 2 つのステートメントは、セミコロンで区切る必要があります。

スカラー値を定義する

次の例では、スカラー式のステートメントを使用しています。

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 ステートメントを使用します。 2 つの数値を乗算する関数 MultiplyByN をクエリで定義します。

let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1 
| extend result = MultiplyByN(x, 5)

出力

x 結果
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))

出力

x 結果
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

出力

結果
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

出力

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

スキーマを使用した表形式の引数

次の例では、表パラメーター Tstring 型の列 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
ATLANTIC SOUTH ATLANTIC SOUTHATLANTIC SOUTH
FLORIDA FLORIDAFLORIDA
FLORIDA FLORIDAFLORIDA
GEORGIA GEORGIAGEORGIA
MISSISSIPPI MISSISSIPPIMISSISSIPPI
... ...

ワイルドカードを使用した表形式の引数

表パラメーター T には任意のスキーマを指定でき、関数 CountRecordsInTable は機能します。

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

出力

Count
59,066