let-Anweisung

Verwenden Sie die let Anweisung, um einen Variablennamen gleich einem Ausdruck oder einer Funktion festzulegen oder Ansichten zu erstellen.

let Anweisungen sind nützlich für:

  • Aufteilen eines komplexen Ausdrucks in mehrere Teile, die jeweils durch eine Variable dargestellt werden.
  • Definieren von Konstanten außerhalb des Abfragetexts für die Lesbarkeit.
  • Definieren sie eine Variable einmal und verwenden Sie sie mehrmals innerhalb einer Abfrage.

Wenn die Variable zuvor einen anderen Wert darstellt, z. B. in geschachtelten Anweisungen, gilt die innerste let Anweisung.

Informationen zum Optimieren mehrerer Verwendungen der let Anweisung innerhalb einer einzelnen Abfrage finden Sie unter Optimieren von Abfragen, die benannte Ausdrücke verwenden.

Syntax: Skalar oder tabellarische Ausdrücke

letNamen=ScalarExpression

letNamen=TabularExpression

Argumente

Argument BESCHREIBUNG Beispiel
Name Der Variablename muss gültig sein. Sie können den Namen z. B. ausweichen. ["Name with spaces"]
ScalarExpression Ein Ausdruck mit einem Skalarergebnis. let one=1;
TabularExpression Ein Ausdruck mit einem tabellarischen Ergebnis. let RecentLog = Logs \| where Timestamp > ago(1h)

Syntax: Ansicht oder Funktion

letNamen= [] ( [viewTabularArgName [ArgType:,*,(): ] ... ] ){FunctionBody}

letNamen= [view] ( [ [TabularArgName[AttributName::(AttributType] [, ... ] ), [ ArgName:ArgType , ...] ] ){FunctionBody '}

Argumente

Argument BESCHREIBUNG
FunctionBody Ein Ausdruck, der eine benutzerdefinierte Funktion darstellt.
view Wird nur in einer parameterlosen let Anweisung ohne Argumente angezeigt. Bei Verwendung wird die let Anweisung in Abfragen mit einem union Operator mit einer Wildcardauswahl der Tabellen/Ansichten enthalten.
TabularArgName Der Name des tabellarischen Arguments. Kann im FunctionBody angezeigt werden und ist an einen bestimmten Wert gebunden, wenn die benutzerdefinierte Funktion aufgerufen wird.
AttributName: AttributType Der Name und der Typ des Attributs. Teil der Tabellenschemadefinition, die einen Satz von Attributen mit ihren Typen enthält.
ArgName Der Name des Skalararguments. Kann im FunctionBody angezeigt werden und ist an einen bestimmten Wert gebunden, wenn die benutzerdefinierte Funktion aufgerufen wird.
ArgType Der Typ des Skalararguments. Derzeit werden die folgenden Funktionen für benutzerdefinierte Funktionen unterstützt: bool, timespanstringdatetimelongrealund (und dynamic Aliase für diese Typen).

Hinweis

  • Sie können für den tabellarischen Ausdruck verwenden (*) .
  • Wenn Sie einen tabellarischen Ausdruck als Teil einer benutzerdefinierten Funktion verwenden, können die Spalten nicht als Teil der Funktion zugegriffen werden.
  • Tabellarische Argumente werden vor Skalarargumenten angezeigt.
  • Zwei Anweisungen müssen durch ein Semikolon getrennt werden.

Beispiele

Definieren von Skalarwerten

Im folgenden Beispiel wird eine Skalarausdruck-Anweisung verwendet.


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

Im folgenden Beispiel wird der Name mithilfe der ['name'] Notation some number gebunden und dann in einer Tabellarausdruck-Anweisung verwendet.

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

Erstellen einer benutzerdefinierten Funktion mit Skalarberechnung

Dieses Beispiel verwendet die let-Anweisung mit Argumenten für die Skalarberechnung. Die Abfrage definiert Funktion MultiplyByN für die Multiplikation von zwei Zahlen.

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

Ausgabe

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

Erstellen einer benutzerdefinierten Funktion, die Eingaben abschneidet

Im folgenden Beispiel werden führende und nachgestellte aus der Eingabe entfernt.

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

Ausgabe

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

Verwenden mehrerer let-Anweisungen

In diesem Beispiel werden zwei let-Anweisungen definiert, wobei eine Anweisung (foo2) eine andere Anweisung (foo1) verwendet.

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

Ausgabe

result
50

Erstellen einer Ansicht oder einer virtuellen Tabelle

In diesem Beispiel wird gezeigt, wie Sie eine Let-Anweisung verwenden, um eine oder eine view virtuelle Tabelle zu erstellen.

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

Ausgabe

$table MyColumn
Range10 5
Range20 5

Verwenden einer Materialisierungsfunktion

Mit der materialize()-Funktion können Sie Ergebnisse von Unterabfragen während der Zeit der Abfrageausführung zwischenspeichern. Wenn Sie die materialize() Funktion verwenden, werden die Daten zwischengespeichert, und alle nachfolgenden Aufrufe des Ergebnisses werden zwischengespeicherte Daten verwendet.

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

Ausgabe

Tag1 Tag2 Prozentwert
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

Verwenden geschachtelter Let-Anweisungen

Geschachtelte Let-Anweisungen sind zulässig, einschließlich eines benutzerdefinierten Funktionsausdrucks. Lassen Sie Anweisungen und Argumente sowohl im aktuellen als auch im inneren Bereich des Funktionstexts anwenden.

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