let ステートメント

変数名を式または関数と同じに設定したり、ビューを作成したりするには、let ステートメントが使われます。

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

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

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

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

注意

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

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

letName=Expression

重要

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

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

パラメーター

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

構文: ビューまたは関数

letName= [view] ([ パラメーター ]){FunctionBody}

重要

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

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

パラメーター

名前 必須 説明
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