Delen via


Let-instructie

Van toepassing op: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel-

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:

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

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

Zie Query's optimaliseren die gebruikmaken van benoemde expressiesom meerdere toepassingen van de let-instructie binnen één query te optimaliseren.

Notitie

De instructie let 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 of tabellaire expressies

let = Expressie

Belangrijk

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

Meer informatie over syntaxisconventies.

Parameters

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

Syntaxis: Weergave of functie

let Name= [view] ([ Parameters ]){FunctionBody}

Belangrijk

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

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
FunctionBody- string ✔️ Een expressie die een door de gebruiker gedefinieerde functie oplevert.
view string Alleen relevant voor een parameterloze let instructie. Wanneer deze wordt gebruikt, wordt de instructie let opgenomen in query's met een union operator met jokertekens van de tabellen/weergaven. Zie bijvoorbeeld Een weergave of virtuele tabel maken.
parameters string Nul of meer door komma's gescheiden parameters voor tabellaire of scalaire functies.

Voor elke parameter van tabellair type moet de parameter de indeling hebben TableName:TableSchema, waarin 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 van invoer deze kolommen bevatten. Als er een jokerteken is opgegeven, kan het argument tabellaire invoer elk schema hebben. Als u wilt verwijzen naar kolommen in de hoofdtekst van de functie, moeten ze worden opgegeven. Zie argument Tabellaire tabel met schema- en argument tabellaire tabel met jokertekens.

Geef voor elke parameter van het scalaire type de parameternaam en het parametertype op in de notatie Name:Type. De naam kan worden weergegeven in de FunctionBody- 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

In het helpclusteris er een Samples database met een StormEvents tabel.

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 gekoppeld met behulp van de notatie ['name'] en wordt deze vervolgens gebruikt in een expressie-instructie in tabelvorm.

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

uitvoer

y
0
5
10
15
20

Een door de gebruiker gedefinieerde functie maken met scalaire berekening

In dit voorbeeld wordt de let-instructie gebruikt met argumenten voor scalaire berekeningen. De query definieert 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 resultaat
1 5
2 10
3 15
4 20
5 25

Een door de gebruiker gedefinieerde functie maken waarmee invoer wordt geknipt

In het volgende voorbeeld worden voorloop- en volgvolgende items 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 resultaat
10 0
11
12 2
13 3
14 4
15 5

Meerdere let-instructies gebruiken

In dit voorbeeld worden twee let-instructies gedefinieerd waarbij één instructie (foo2) een andere instructie (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

resultaat
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 materialize-functie gebruiken

Met de functie materialize() kunt u subqueryresultaten opslaan tijdens het uitvoeren van query's. Wanneer u de functie materialize() 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, inclusief binnen een door de gebruiker gedefinieerde functie-expressie. Laat instructies en argumenten toepassen 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 | ...

Argument in tabelvorm met schema

In het volgende voorbeeld wordt aangegeven dat de tabelparameter T een kolom moet hebben State van het type string. De tabel T kan ook andere kolommen bevatten, maar er kan niet naar worden verwezen in de functie StateState omdat deze 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 ATLANTISCHE ZUIDATLANTISCHE ZUID
FLORIDA FLORIDA SPAINIDA
FLORIDA FLORIDA SPAINIDA
GEORGIË GEORGIAGEORGIA
MISSISSIPPI MISSISSIPPIMISSISSIPPI
... ...

Argument in tabelvorm met jokerteken

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

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

uitvoer

Tellen
59,066