Инструкция let
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Оператор let
используется для задания имени переменной, равного выражению или функции, или для создания представлений.
let
операторы полезны для:
- Разбиение сложного выражения на несколько частей, каждая из которых представлена переменной.
- Определение констант за пределами текста запроса для удобства чтения.
- Определение переменной один раз и его использование несколько раз в запросе.
Если переменная ранее представляла другое значение, например в вложенных инструкциях, применяется самая let
внутренняя инструкция.
Чтобы оптимизировать несколько вариантов использования инструкции let
в одном запросе, см. статью "Оптимизация запросов", использующих именованные выражения.
Примечание.
Оператор let
привязывает имя к вычислению, а не к вычисляемой стоимости этого вычисления. Это означает, что несколько ссылок на одно и то же имя могут возвращать разные значения из-за вычисления, вычисляемого несколько раз. Если это не нужное поведение, используйте toscalar() или materialize().
Синтаксис: скалярные или табличные выражения
let
Имя =
Выражение
Внимание
Пусть операторы должны следовать за точкой с запятой. Между операторами let или между операторами let и другими операторами запроса не может быть пустых строк.
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Description |
---|---|---|---|
Имя | string |
✔️ | Имя переменной. Имя можно экранировать с скобками. Например, ["Name with spaces"] . |
Выражение | string |
✔️ | Выражение со скалярным или табличным результатом. Например, выражение со скалярным результатом будет let one=1; , а выражение с табличным результатом будет let RecentLog = Logs | where Timestamp > ago(1h) . |
Синтаксис: представление или функция
let
Имя =
[] (
[ view
Параметры ])
{
FunctionBody }
Внимание
Пусть операторы должны следовать за точкой с запятой. Между операторами let или между операторами let и другими операторами запроса не может быть пустых строк.
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
FunctionBody | string |
✔️ | Выражение, которое дает определяемую пользователем функцию. |
view |
string |
Применимо только для инструкции без let параметров. При использовании let инструкция включается в запросы с оператором union с подстановочными знаками для таблиц и представлений. Пример см. в разделе "Создание представления" или "Виртуальная таблица". |
|
Параметры | string |
Ноль или больше параметров табличной или скалярной функции с разделим запятыми. Для каждого параметра табличного типа параметр должен находиться в формате TableName : TableSchema, в котором TableSchema представляет собой разделенный запятыми список столбцов в формате ColumnName: ColumnType или подстановочный знак ().* Если заданы столбцы, входной табличный аргумент должен содержать эти столбцы. Если указан подстановочный знак, входной табличный аргумент может иметь любую схему. Чтобы ссылаться на столбцы в теле функции, их необходимо указать. Примеры см . в табличном аргументе со схемой и табличным аргументом с подстановочным знаком.Для каждого параметра скалярного типа укажите имя параметра и тип параметра в формате Name : Type. Имя может отображаться в FunctionBody и привязано к определенному значению при вызове определяемой пользователем функции. Единственными поддерживаемыми типами являются bool , string , , datetime long , dynamic timespan real , и псевдонимы для этих типов. |
Примечание.
- Табличные параметры должны отображаться перед скалярными параметрами.
- Любые два оператора должны быть разделены точкой с запятой.
Примеры
Определение скалярных значений
В следующем примере используется скалярная инструкция выражения.
let n = 10; // number
let place = "Dallas"; // string
let cutoff = ago(62d); // datetime
Events
| where timestamp > cutoff
and city == place
| take n
В следующем примере имя привязывается some number
с помощью ['name']
нотации, а затем используется в инструкции табличного выражения.
let ['some number'] = 20;
range y from 0 to ['some number'] step 5
Создание определяемой пользователем функции с скалярным вычислением
В этом примере используется оператор let с аргументами для скалярного вычисления. Запрос определяет функцию MultiplyByN
для умножения двух чисел.
let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1
| extend result = MultiplyByN(x, 5)
Выходные данные
x | result |
---|---|
1 | 5 |
2 | 10 |
3 | 15 |
4 | 20 |
5 | 25 |
Создание определяемой пользователем функции, которая обрезает входные данные
В следующем примере удаляются начальные и конечные из входных данных.
let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1
| extend result = TrimOnes(tostring(x))
Выходные данные
x | result |
---|---|
10 | 0 |
11 | |
12 | 2 |
13 | 3 |
14 | 4 |
15 | 5 |
Использование множественных операторов let
В этом примере определяются два оператора 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
Выходные данные
result |
---|
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()
функции данные кэшируются, а любой последующий вызов результата использует кэшированные данные.
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
Выходные данные
День1 | День 2 | Процентное отношение |
---|---|---|
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 start_time = ago(5h);
let end_time = start_time + 2h;
T | where Time > start_time and Time < end_time | ...
Табличный аргумент со схемой
В следующем примере указывается, что параметр T
таблицы должен иметь столбец State
типа string
. T
Таблица также может содержать другие столбцы, но их нельзя ссылаться в функцииStateState
, так как они не объявлены.
let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s
Выходные данные
Штат | s_s |
---|---|
ЮЖНАЯ АТЛАНТИКА | АТЛАНТИЧЕСКИЙ ЮГATLANTIC SOUTH |
FLORIDA | ФЛОРИДАФЛОРИДА |
FLORIDA | ФЛОРИДАФЛОРИДА |
ДЖОРДЖИЯ | ДЖОРДЖИЯGEORGIA |
МИССИСИПИ | MISSISSIPPIMISSISSIPPI |
... | ... |
Табличный аргумент с подстановочным знаком
Параметр T
таблицы может иметь любую схему, и функция CountRecordsInTable
будет работать.
let CountRecordsInTable=(T: (*)) { T | count };
StormEvents | invoke CountRecordsInTable()
Выходные данные
Count |
---|
59 066 |