Instrucción Let

Una instrucción let se usa para establecer un nombre de variable igual a una expresión o una función, o para crear vistas.

Las instrucciones let son útiles para:

  • Dividir una expresión compleja en varias partes, cada una representada por una variable.
  • Definir constantes fuera del cuerpo de la consulta para mejorar la legibilidad.
  • Definir una variable una vez y usarla varias veces dentro de una consulta.

Si la variable anteriormente representaba otro valor, por ejemplo, en instrucciones anidadas, se aplicará la instrucción let más interna.

Para optimizar varios usos de la instrucción let en una sola consulta, vea Optimización de consultas que usan expresiones con nombre.

Nota

La instrucción vincula let un nombre a un cálculo, no al valor evaluado de ese cálculo. Este comportamiento significa que varias referencias al mismo nombre pueden devolver valores diferentes debido al cálculo que se evalúa varias veces. Si no es el comportamiento deseado, use toscalar() o materialize().

Sintaxis: expresiones escalares o tabulares

letNombre=Expresión

Importante

Las instrucciones Let deben ir seguidas de punto y coma. No puede haber líneas en blanco entre instrucciones let o entre instrucciones let y otras instrucciones de consulta.

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido Descripción
Nombre string ✔️ El nombre de la variable. Puede omitir el nombre entre corchetes. Por ejemplo, ["Name with spaces"].
Expression string ✔️ Una expresión con un resultado escalar o tabular. Por ejemplo, una expresión con un resultado escalar sería let one=1;, y una expresión con un resultado tabular sería let RecentLog = Logs | where Timestamp > ago(1h).

Sintaxis: vista o función

letNombre= [view] ([ Parameters ]){FunctionBody}

Importante

Las instrucciones Let deben ir seguidas de punto y coma. No puede haber líneas en blanco entre instrucciones let o entre instrucciones let y otras instrucciones de consulta.

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido Descripción
FunctionBody string ✔️ Una expresión que representa una función definida por el usuario.
view string Solo es relevante para una instrucción let sin parámetros. Cuando se usa, la instrucción let se incluye en las consultas con un operador union y una selección de caracteres comodín de las tablas y vistas. Para obtener un ejemplo, consulte Creación de una vista o una tabla virtual.
Parámetros string Cero o más parámetros de función tabular o escalar separados por comas.

En el caso de los parámetros de tipo tabular, el parámetro debe tener el formato TableName:TableSchema, en el que TableSchema es una lista separada por comas de columnas con el formato ColumnName:ColumnType o un carácter comodín (*). Si se especifican columnas, el argumento tabular de entrada debe contener estas columnas. Si se especifica un carácter comodín, el argumento tabular de entrada puede tener cualquier esquema. Para hacer referencia a columnas en el cuerpo de la función, estas deben especificarse. Para obtener ejemplos, consulte Argumento tabular con esquema y Argumento tabular con caracteres comodín.

Para cada parámetro de tipo escalar, proporcione el nombre y el tipo del parámetro con el formato Nombre:Tipo. El nombre puede aparecer en FunctionBody y se enlaza a un valor determinado cuando se invoca la expresión lambda. Los únicos tipos admitidos son bool, string, long, datetime, timespan, real, dynamic y su correspondientes alias.

Nota:

  • Los parámetros tabulares deben aparecer antes de los parámetros escalares.
  • Las instrucciones deben estar separadas por un punto y coma.

Ejemplos

Definición de valores escalares

En el ejemplo siguiente se usa una instrucción de expresión escalar.

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

En el ejemplo siguiente se enlaza el nombre some number mediante la notación ['name'] y, a continuación, se usa en una instrucción de expresión tabular.

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

Creación de una función definida por el usuario mediante cálculo escalar

En este ejemplo se usa la instrucción Let con argumentos para el cálculo escalar. La consulta define la función MultiplyByN para multiplicar dos números.

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

Salida

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

Creación de una función definida por el usuario que recorta la entrada

En el siguiente ejemplo se quitan los valores iniciales y finales de la entrada.

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

Salida

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

Uso de varias instrucciones Let

En este ejemplo se definen dos instrucciones Let de manera que una instrucción (foo2) usa a la otra (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

Salida

resultado
50

Creación de una vista o una tabla virtual

En este ejemplo se muestra cómo usar una instrucción let para crear una view o tabla virtual.

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

Salida

$table MyColumn
Range10 5
Range20 5

Uso de la función materialize

La función materialize() permite almacenar en caché los resultados de la subconsulta durante la ejecución de la consulta. Cuando se usa la función materialize(), los datos se almacenan en caché y cualquier invocación posterior del resultado usa datos almacenados en caché.

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

Salida

Día 1 Día 2 Porcentaje
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

Uso de instrucciones let anidadas

Se permite el uso de instrucciones let anidadas, incluida una expresión de función definida por el usuario. Las instrucciones y argumentos Let se aplican en el ámbito actual e interno del cuerpo de la función.

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

Argumento tabular con esquema

En el ejemplo siguiente se especifica que el parámetro T de tabla debe tener una columna State de tipo string. La tabla T también puede incluir otras columnas, pero no se puede hacer referencia a ellas en la función StateState porque no se declaran.

let StateState=(T: (State: string)) { T | extend s_s=strcat(State, State) };
StormEvents
| invoke StateState()
| project State, s_s

Salida

State s_s
ATLÁNTICO SUR ATLANTIC SOUTHATLANTIC SOUTH
FLORIDA FLORIDAFLORIDA
FLORIDA FLORIDAFLORIDA
GEORGIA GEORGIAGEORGIA
MISISIPÍ MISSISSIPPIMISSISSIPPI
... ...

Argumento tabular con carácter comodín

El parámetro T de tabla puede tener cualquier esquema y la función CountRecordsInTable funcionará.

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

Salida

Count
59 066