toscalar()

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

返回所计算的表达式的标量常数值。

此函数对于需要暂存计算的查询很有用。 例如,计算事件总数,然后使用结果筛选超过所有事件的特定百分比的组。

必须用分号分隔任意两个语句。

语法

toscalar(expression)

详细了解语法约定

参数

客户 类型​​ 必需 说明
expression string ✔️ 要转换为标量值的值。

返回

所计算表达式的标量常数值。 如果结果是表格格式,则会采用第一列和第一行进行转换。

提示

使用 toscalar() 时,可以使用 let 语句以提高查询的可读性。

限制

toscalar() 不能应用于对每一行应用该函数的方案。 这是因为在查询执行期间,该函数只能计算一定的次数。 通常,当达到此限制时,将返回以下错误:can't use '<column name>' as it is defined outside its row-context scope.

在以下示例中,查询失败并显示错误:

'toscalar': can't use 'x' as it is defined outside its row-context scope.

let _dataset1 = datatable(x:long)[1,2,3,4,5];
let _dataset2 = datatable(x:long, y:long) [ 1, 2, 3, 4, 5, 6];
let tg = (x_: long)
{
    toscalar(_dataset2| where x == x_ | project y);
};
_dataset1
| extend y = tg(x)

可以使用 join 运算符缓解此故障,如以下示例所示:

let _dataset1 = datatable(x: long)[1, 2, 3, 4, 5];
let _dataset2 = datatable(x: long, y: long) [1, 2, 3, 4, 5, 6];
_dataset1
| join (_dataset2) on x 
| project x, y

输出

x y
1 2
3 4
5 6

示例

StartEndStep 作为标量常数计算,并将结果用于 range 计算。

let Start = toscalar(print x=1);
let End = toscalar(range x from 1 to 9 step 1 | count);
let Step = toscalar(2);
range z from Start to End step Step | extend start=Start, end=End, step=Step

输出

z start end 步骤
1 1 9 2
3 1 9 2
5 1 9 2
7 1 9 2
9 1 9 2

下面的示例演示如何使用 toscalar来“修复”表达式,以便将表达式精确计算一次。 在这种情况下,要计算的表达式每次计算将返回不同的值。

let g1 = toscalar(new_guid());
let g2 = new_guid();
range x from 1 to 2 step 1
| extend x=g1, y=g2

输出

x y
e6a15e72-756d-4c93-93d3-fe85c18d19a3 c2937642-0d30-4b98-a157-a6706e217620
e6a15e72-756d-4c93-93d3-fe85c18d19a3 c6a48cb3-9f98-4670-bf5b-589d0e0dcaf5