Let-instructie

Een let instructie wordt gebruikt om een variabelenaam in te stellen die gelijk is aan een expressie of functie, of om weergaven te maken.

let -instructies zijn handig voor:

  • Een complexe expressie opsplitsen in meerdere delen, elk vertegenwoordigd door een variabele.
  • Constanten definiëren buiten de hoofdtekst van de query voor leesbaarheid.
  • Een variabele eenmaal definiëren en deze meerdere keren gebruiken binnen een query.

Als de variabele eerder een andere waarde vertegenwoordigde, bijvoorbeeld in geneste instructies, is de binnenste let instructie van toepassing.

Zie Query's optimaliseren die gebruikmaken van benoemde expressies als u meerdere toepassingen van de let instructie binnen één query wilt optimaliseren.

Notitie

De let instructie verbindt een naam aan een berekening, niet aan de geëvalueerde waarde van die berekening. Dit gedrag betekent dat meerdere verwijzingen naar dezelfde naam verschillende waarden kunnen retourneren omdat de berekening meerdere keren wordt geëvalueerd. Als dit niet het gewenste gedrag is, gebruikt u toscalar() of materialize().

Syntaxis: Scalaire expressies of tabellaire expressies

letNaam=Expressie

Belangrijk

Let-instructies moeten worden gevolgd door een puntkomma. Er mogen geen lege regels zijn tussen let-instructies of tussen let-instructies en andere queryinstructies.

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
Naam string ✔️ De naam van de variabele. U kunt de naam met vierkante haken escapen. Bijvoorbeeld ["Name with spaces"].
Expression string ✔️ Een expressie met een scalair of tabellair resultaat. Een expressie met een scalair resultaat is let one=1;bijvoorbeeld , en een expressie met een tabellair resultaat is let RecentLog = Logs | where Timestamp > ago(1h).

Syntaxis: weergave of functie

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

Belangrijk

Let-instructies moeten worden gevolgd door een puntkomma. Er mogen geen lege regels zijn tussen let-instructies of tussen let-instructies en andere queryinstructies.

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
Functiebody string ✔️ Een expressie die een door de gebruiker gedefinieerde functie oplevert.
view string Alleen relevant voor een parameterloze let instructie. Bij gebruik wordt de let instructie opgenomen in query's met een union operator met jokertekenselectie van de tabellen/weergaven. Zie Een weergave of virtuele tabel maken voor een voorbeeld.
Parameters string Nul of meer door komma's gescheiden tabel- of scalaire functieparameters.

Voor elke parameter van het type tabel moet de parameter de indeling TableName:TableSchema hebben, waarbij TableSchema een door komma's gescheiden lijst met kolommen is in de indeling ColumnName:ColumnType of een jokerteken (*). Als er kolommen zijn opgegeven, moet het argument in tabelvorm voor invoer deze kolommen bevatten. Als er een jokerteken is opgegeven, kan het tabellaire invoerargument elk schema hebben. Als u wilt verwijzen naar kolommen in de hoofdtekst van de functie, moeten deze worden opgegeven. Zie Tabellair argument met schema en Tabelargument met jokerteken voor voorbeelden.

Geef voor elke parameter van het scalaire type de parameternaam en het parametertype op in de indeling Naamtype:. De naam kan worden weergegeven in de FunctieBody en is gebonden aan een bepaalde waarde wanneer de door de gebruiker gedefinieerde functie wordt aangeroepen. De enige ondersteunde typen zijn bool, string, long, datetime, , timespan, real, dynamicen de aliassen voor deze typen.

Notitie

  • Tabellaire parameters moeten worden weergegeven vóór scalaire parameters.
  • Twee instructies moeten worden gescheiden door een puntkomma.

Voorbeelden

Scalaire waarden definiëren

In het volgende voorbeeld wordt een scalaire expressie-instructie gebruikt.

let n = 10;  // number
let place = "Dallas";  // string
let cutoff = ago(62d); // datetime 
Events 
| where timestamp > cutoff 
    and city == place 
| take n

In het volgende voorbeeld wordt de naam some number gebonden met behulp van de ['name'] notatie en wordt deze vervolgens gebruikt in een tabellaire expressie-instructie.

let ['some number'] = 20;
range y from 0 to ['some number'] step 5

Een door de gebruiker gedefinieerde functie maken met scalaire berekening

In dit voorbeeld wordt de let-instructie gebruikt met argumenten voor scalaire berekening. De query definieert de functie MultiplyByN voor het vermenigvuldigen van twee getallen.

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

Uitvoer

x result
1 5
2 10
3 15
4 20
5 25

Een door de gebruiker gedefinieerde functie maken waarmee invoer wordt bijgeknipt

In het volgende voorbeeld worden voorloop- en volgtekens uit de invoer verwijderd.

let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1 
| extend result = TrimOnes(tostring(x))

Uitvoer

x result
10 0
11
12 2
13 3
14 4
15 5

Meerdere let-instructies gebruiken

In dit voorbeeld worden twee let-instructies gedefinieerd waarbij de ene instructie (foo2) een andere (foo1) gebruikt.

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

Uitvoer

result
50

Een weergave of virtuele tabel maken

In dit voorbeeld ziet u hoe u een let-instructie gebruikt om een view of virtuele tabel te maken.

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

Uitvoer

$table MyColumn
Bereik10 5
Bereik20 5

Een materialisatiefunctie gebruiken

Met de materialize() functie kunt u subqueryresultaten in de cache opslaan tijdens het uitvoeren van de query. Wanneer u de materialize() functie gebruikt, worden de gegevens in de cache opgeslagen en worden bij elke volgende aanroep van het resultaat gegevens in de cache gebruikt.

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

Uitvoer

Dag1 Dag2 Percentage
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

Geneste let-instructies gebruiken

Geneste let-instructies zijn toegestaan, ook binnen een door de gebruiker gedefinieerde functie-expressie. Laat instructies en argumenten van toepassing zijn in zowel het huidige als het binnenste bereik van de hoofdtekst van de functie.

let start_time = ago(5h); 
let end_time = start_time + 2h; 
T | where Time > start_time and Time < end_time | ...

Tabellair argument met schema

In het volgende voorbeeld wordt aangegeven dat de tabelparameter T een kolom State van het type stringmoet hebben. De tabel T kan ook andere kolommen bevatten, maar er kan niet naar worden verwezen in de functie StateState omdat de niet zijn gedeclareerd.

let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s

Uitvoer

Staat s_s
ATLANTISCHE ZUID ATLANTIC SOUTHATLANTIC SOUTH
FLORIDA FLORIDAFLORIDA
FLORIDA FLORIDAFLORIDA
GEORGIË GEORGIAGEORGIA
MISSISSIPPI MISSISSIPPIMISSISSIPPI
... ...

Tabellair argument met jokerteken

De tabelparameter T kan elk schema hebben en de functie CountRecordsInTable werkt.

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

Uitvoer

Count
59,066