如何编写Kusto查询:变量含指定三值时返回空结果
Kusto查询实现指定逻辑
需求:
- 当
someValues数据表同时包含"111"、"222"、"333"三个字符串时,查询返回空结果 - 若仅包含其中1个或2个字符串,则返回"False"
示例数据
let someValues = datatable (name: string) [ "111", "222", "333", ]; // my query
用户尝试的代码(未达成目标)
let someValues = datatable (name: string) [ "111", "222", "333", ]; someValues | summarize make_set(name) | where set_name contains "111" and set_name contains "222" and set_name contains "333" // 这段代码无效,因为满足条件时会输出1行结果,而非空
等效C#逻辑代码
static void Main(string[] args) { List<string> s = new List<string>() {"111", "222", "333"}; if (s.Contains("111") && s.Contains("222") && s.Contains("333")) return; // 不返回任何结果 else { Console.WriteLine("False"); // 输出"False" } }
正确的Kusto查询方案
方案一:使用集合包含判断函数
let someValues = datatable (name: string) [ "111", "222", "333", ]; let requiredValues = dynamic(["111", "222", "333"]); someValues | summarize valueSet = make_set(name) | where not(set_has_all(valueSet, requiredValues)) | project result = "False"
逻辑说明:
- 定义需要检查的目标字符串数组
requiredValues - 将
someValues中的字符串聚合为一个唯一值集合valueSet - 用
set_has_all判断集合是否包含所有目标元素,取反后仅保留不满足条件的情况 - 输出"False";若满足同时包含三个字符串,
where条件过滤后无结果返回
方案二:统计匹配数量判断
let someValues = datatable (name: string) [ "111", "222", "333", ]; let requiredValues = dynamic(["111", "222", "333"]); someValues | summarize matchedCount = countif(name in (requiredValues)) | where matchedCount != array_length(requiredValues) | project result = "False"
逻辑说明:
- 统计
someValues中匹配目标字符串的数量matchedCount - 当匹配数量不等于目标数组长度(3)时,输出"False";否则返回空结果
内容的提问来源于stack exchange,提问作者Varun Sharma
相关产品推荐
相关产品推荐

