Инструкция let

Оператор let используется для задания имени переменной, равной выражению или функции, или для создания представлений.

let Операторы полезны для:

  • Разбиение сложного выражения на несколько частей, каждая из которых представлена переменной.
  • Определение констант за пределами текста запроса для удобочитаемости.
  • Определение переменной один раз и ее использование несколько раз в запросе.

Если переменная ранее представляла другое значение, например во вложенных инструкциях, применяется самый let внутренний оператор.

Сведения об оптимизации нескольких вариантов использования инструкции let в одном запросе см. в статье Оптимизация запросов, использующих именованные выражения.

Примечание

Оператор let привязывает имя к вычислению, а не к вычисляемого значения этого вычисления. Это означает, что несколько ссылок на одно и то же имя могут возвращать разные значения из-за многократного вычисления. Если это не является требуемым поведением, используйте toscalar() или materialize().

Синтаксис: скалярные или табличные выражения

letИмя=Выражение

Важно!

За операторами Let должна следовать точка с запятой. Между операторами let или между операторами let и другими инструкциями запроса не может быть пустых строк.

Дополнительные сведения о соглашениях о синтаксисе.

Параметры

Имя Тип Обязательно Описание
имя; string ✔️ Имя переменной. Имя можно экранировать с помощью скобок. Например, ["Name with spaces"].
Выражение string ✔️ Выражение со скалярным или табличным результатом. Например, выражение со скалярным результатом будет иметь значение let one=1;, а выражение с табличным результатом — let RecentLog = Logs | where Timestamp > ago(1h).

Синтаксис: представление или функция

letИмя= [view] ([ Параметры ]){FunctionBody}

Важно!

За операторами Let должна следовать точка с запятой. Между операторами let или между операторами let и другими инструкциями запроса не может быть пустых строк.

Дополнительные сведения о соглашениях о синтаксисе.

Параметры

Имя Тип Обязательно Описание
FunctionBody string ✔️ Выражение, возвращающее определяемую пользователем функцию.
view string Относится только к оператору без let параметров. При использовании let оператор включается в запросы с union помощью оператора с подстановочными знаками для таблиц или представлений. Пример см. в разделе Создание представления или виртуальной таблицы.
Параметры string Ноль или более параметров табличной или скалярной функции, разделенных запятыми.

Для каждого параметра табличного типа параметр должен иметь формат TableName:TableSchema, в котором TableSchema — это разделенный запятыми список столбцов в формате ColumnName:ColumnType или подстановочный знак (*). Если указаны столбцы, то входной табличный аргумент должен содержать эти столбцы. Если указан подстановочный знак, то входной табличный аргумент может иметь любую схему. Чтобы ссылаться на столбцы в теле функции, их необходимо указать. Примеры см. в разделах Табличный аргумент со схемой и Табличный аргумент с подстановочным знаком.

Для каждого параметра скалярного типа укажите имя и тип параметра в формате Тип имени:. Имя может отображаться в FunctionBody и привязывается к определенному значению при вызове определяемой пользователем функции. Единственными поддерживаемыми типами являются bool, string, long, datetimetimespan, , real, dynamicи псевдонимы этих типов.

Примечание

  • Табличные параметры должны отображаться перед скалярными параметрами.
  • Любые два оператора должны быть разделены точкой с запятой.

Примеры

Определение скалярных значений

В следующем примере используется оператор скалярного выражения.

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 набор по
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 набор по
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

Выходные данные

набор по
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() позволяет кэшировать результаты вложенных запросов во время выполнения запроса. При использовании 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
ЮЖНО-АТЛАНТИЧЕСКИЕ ШТАТЫ АТЛАНТИЧЕСКИЙ САУТАТЛАНТИЧЕСКИЙ ЮГ
Флорида ФЛОРИДАФЛОРИДА
Флорида ФЛОРИДАФЛОРИДА
Грузия GEORGIAGEORGIA
Миссисипи MISSISSIPPIMISSISSIPPI
... ...

Табличный аргумент с подстановочным знаком

Параметр T таблицы может иметь любую схему, и функция CountRecordsInTable будет работать.

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

Выходные данные

Count
59 066