快点!has_any |其中值不包含集合中的任何值

Kusto !has_any | where value does not contain any value in set

Kusto 中是否有内置方法来检查一个值不包含多个项目?我知道我可以使用 has_any 来检查一个项目是否包含集合中的任何值,但我似乎无法让它与“!”一起使用。操作员。 示例:

let Employees = datatable(Id:int, Name:string, Position:string ) 
[
   1, "Bob", "General Manager",
   2, "Mary", "Coordinator",
   3, "John", "Sales Representitive"
];
Employees
| where Position !has_any("Manager", "Sales")

预期输出:

如果我删除 not 运算符 (!),它会起作用,returns Bob 和 John 的信息。但我想将它从 has any/contains any 反转为 does not contain any。我也试过

| where Position has_any !("Manager", "Sales")

但它似乎是 has_any 和 "!" 的任意组合抛出语法错误,不会 运行。有没有办法在不列出单个 !contains 语句的情况下执行此操作?也就是说,这不是我要找的:

| where Position !contains "Manager" and Position !contains "Sales"

这对于两个条件来说没什么大不了的,但是当你处理一个长列表时,最好使用 has_any 并在它前面加上一个简单的感叹号。


- 更新 -

我最近才发现 has_any 实际上不会在字段包含集合中的任何项目时选取。从技术上讲是正确的,只有当字段 中有任何整个单词匹配 时,它才会被提取。为了澄清,这里有一个例子:

let TestTable = datatable(Id:int, FirstName:string, LastName:string ) 
[
   1, "John", "De La Cruz",
   2, "Susana", "Vanderbelt",
   3, "Stan", "Manlyman",
   4, "Henry", "Van De Camps",
   5, "Alissa", "New man"
];
TestTable
| where not(LastName has_any("de", "man"))

仔细记录结果:

如果你在哪里用这个替换最后一行

| where LastName !contains("de") and LastName !contains("man")

它不会在结果集中产生任何结果。所以如果你真的想要“where field doesn't contain any value in the set”那么据我所知你必须单独写出每一个,没有这样的关键字,您可以在其中传递该功能的集合。如果有人知道这样的关键字,请在评论或新答案中告诉我,我会更新这个问题。

你可以使用 not(): https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/notfunction

例如:

let Employees = datatable(Id:int, Name:string, Position:string ) 
[
   1, "Bob", "General Manager",
   2, "Mary", "Coordinator",
   3, "John", "Sales Representitive"
];
Employees
| where not(Position has_any("Manager", "Sales"))