Instrukcja let
Instrukcja let
służy do ustawiania nazwy zmiennej równej wyrażeniu lub funkcji albo do tworzenia widoków.
let
instrukcje są przydatne w następujących celach:
- Podzielenie złożonego wyrażenia na wiele części, z których każda jest reprezentowana przez zmienną.
- Definiowanie stałych poza treścią zapytania w celu zapewnienia czytelności.
- Definiowanie zmiennej raz i używanie jej wiele razy w zapytaniu.
Jeśli zmienna wcześniej reprezentowała inną wartość, na przykład w instrukcjach zagnieżdżonych, stosuje się najbardziej let
wewnętrzną instrukcję.
Aby zoptymalizować wiele zastosowań instrukcji let
w ramach jednego zapytania, zobacz Optymalizowanie zapytań używających nazwanych wyrażeń.
Uwaga
Instrukcja let
wiąże nazwę z obliczeniem, a nie z obliczoną wartością tego obliczenia. To zachowanie oznacza, że wiele odwołań do tej samej nazwy może zwracać różne wartości ze względu na obliczanie obliczane wiele razy. Jeśli nie jest to pożądane zachowanie, użyj metody toscalar() lub materialize().
Składnia: wyrażenia skalarne lub tabelaryczne
let
Nazwa=
Wyrażenie
Ważne
Instrukcje Let muszą być następnie średnikami. Nie może istnieć puste wiersze między instrukcjami let lub między instrukcjami let i innymi instrukcjami zapytania.
Dowiedz się więcej o konwencjach składniowych.
Parametry
Nazwa | Typ | Wymagane | Opis |
---|---|---|---|
Nazwa | string |
✔️ | Nazwa zmiennej. Możesz uciec od nazwy z nawiasami kwadratowymi. Na przykład ["Name with spaces"] . |
Wyrażenie | string |
✔️ | Wyrażenie z wynikiem skalarnym lub tabelarycznym. Na przykład wyrażenie z wynikiem skalarnym to let one=1; , a wyrażenie z wynikiem tabelarycznym to let RecentLog = Logs | where Timestamp > ago(1h) . |
Składnia: Wyświetlanie lub funkcja
let
Nazwa=
[view
] (
[ Parametry ])
{
FunctionBody}
Ważne
Instrukcje Let muszą być następnie średnikami. Nie może istnieć puste wiersze między instrukcjami let lub między instrukcjami let i innymi instrukcjami zapytania.
Dowiedz się więcej o konwencjach składniowych.
Parametry
Nazwa | Typ | Wymagane | Opis |
---|---|---|---|
FunctionBody | string |
✔️ | Wyrażenie, które daje funkcję zdefiniowaną przez użytkownika. |
view |
string |
Dotyczy tylko instrukcji bez let parametrów. W przypadku użycia instrukcja let jest uwzględniana w zapytaniach z operatorem z wyborem union symboli wieloznacznych tabel/widoków. Aby zapoznać się z przykładem, zobacz Tworzenie widoku lub tabeli wirtualnej. |
|
Parametry | string |
Zero lub więcej parametrów funkcji rozdzielanych przecinkami tabelarycznych lub skalarnych. Dla każdego parametru typu tabelarycznego parametr powinien być w formacie TableName : TableSchema, w którym TableSchema jest rozdzielaną przecinkami listę kolumn w formacie ColumnName: ColumnType lub symbol wieloznaczny (* ). Jeśli określono kolumny, argument tabelaryczny danych wejściowych musi zawierać te kolumny. Jeśli zostanie określony symbol wieloznaczny, wówczas argument tabelaryczny danych wejściowych może mieć dowolny schemat. Aby odwołać się do kolumn w treści funkcji, należy je określić. Aby zapoznać się z przykładami, zobacz Argument tabelaryczny ze schematem i argumentem tabelarycznym z symbolami wieloznacznymi.Dla każdego parametru typu skalarnego podaj nazwę parametru i typ parametru w formacie Typ nazwy : . Nazwa może pojawić się w obiekcie FunctionBody i jest powiązana z określoną wartością po wywołaniu funkcji zdefiniowanej przez użytkownika. Jedynymi obsługiwanymi typami są bool , , timespan datetime real string long , dynamic i aliasy tych typów. |
Uwaga
- Parametry tabelaryczne muszą pojawić się przed parametrami skalarnymi.
- Wszystkie dwie instrukcje muszą być oddzielone średnikiem.
Przykłady
Definiowanie wartości skalarnych
W poniższym przykładzie użyto instrukcji wyrażenia skalarnego.
let n = 10; // number
let place = "Dallas"; // string
let cutoff = ago(62d); // datetime
Events
| where timestamp > cutoff
and city == place
| take n
Poniższy przykład wiąże nazwę some number
przy użyciu ['name']
notacji, a następnie używa jej w instrukcji wyrażenia tabelarycznego.
let ['some number'] = 20;
range y from 0 to ['some number'] step 5
Tworzenie funkcji zdefiniowanej przez użytkownika przy użyciu obliczeń skalarnych
W tym przykładzie użyto instrukcji let z argumentami dla obliczeń skalarnych. Zapytanie definiuje funkcję MultiplyByN
do mnożenia dwóch liczb.
let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1
| extend result = MultiplyByN(x, 5)
Dane wyjściowe
x | result |
---|---|
1 | 5 |
2 | 10 |
3 | 15 |
4 | 20 |
5 | 25 |
Tworzenie funkcji zdefiniowanej przez użytkownika, która przycina dane wejściowe
Poniższy przykład usuwa wiodące i końcowe z danych wejściowych.
let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1
| extend result = TrimOnes(tostring(x))
Dane wyjściowe
x | result |
---|---|
10 | 0 |
11 | |
12 | 2 |
13 | 3 |
14 | 4 |
15 | 5 |
Używanie wielu instrukcji let
W tym przykładzie zdefiniowano dwie instrukcje let, w których jedna instrukcja (foo2
) używa innej (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
Dane wyjściowe
result |
---|
50 |
Tworzenie widoku lub tabeli wirtualnej
W tym przykładzie pokazano, jak utworzyć tabelę wirtualnąview
lub za pomocą instrukcji let.
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
Dane wyjściowe
$table | MyColumn |
---|---|
Zakres10 | 5 |
Zakres 20 | 5 |
Używanie funkcji materializowanie
Funkcja materialize()
umożliwia buforowanie wyników podquery w czasie wykonywania zapytania. Gdy używasz materialize()
funkcji, dane są buforowane, a każde kolejne wywołanie wyniku używa buforowanych danych.
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
Dane wyjściowe
Dzień1 | Dzień2 | Procent |
---|---|---|
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 |
Używanie zagnieżdżonych instrukcji let
Zagnieżdżone instrukcje let są dozwolone, w tym w wyrażeniu funkcji zdefiniowanej przez użytkownika. Instrukcje i argumenty let mają zastosowanie zarówno w bieżącym, jak i wewnętrznym zakresie treści funkcji.
let start_time = ago(5h);
let end_time = start_time + 2h;
T | where Time > start_time and Time < end_time | ...
Tabelaryczny argument ze schematem
Poniższy przykład określa, że parametr T
tabeli musi mieć kolumnę State
typu string
. T
Tabela może również zawierać inne kolumny, ale nie można odwoływać się do nich w funkcjiStateState
, ponieważ nie są zadeklarowane.
let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s
Dane wyjściowe
Stan | s_s |
---|---|
POŁUDNIE ATLANTYCKIE | ATLANTYK SOUTHATLANTIC SOUTH |
FLORIDA | FLORIDAFLORIDA |
FLORIDA | FLORIDAFLORIDA |
GRUZJA | GEORGIAGEORGIA |
MISSISSIPPI | MISSISSIPPISSISSIPPI |
... | ... |
Tabelaryczny argument z symbolem wieloznacznym
Parametr T
tabeli może mieć dowolny schemat, a funkcja CountRecordsInTable
będzie działać.
let CountRecordsInTable=(T: (*)) { T | count };
StormEvents | invoke CountRecordsInTable()
Dane wyjściowe
Liczba |
---|
59,066 |
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla