Kusto !has_any | где значение не содержит никакого значения в наборе

#azure-data-explorer #kql

#azure-data-explorer #kql

Вопрос:

Есть ли встроенный способ в 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 (!), он сработает и вернет информацию для Боба и Джона. Но я хочу изменить его с has any / содержит any на does not contain any . Я также пытался

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

Но похоже, что любая комбинация has_any и «!» выдает синтаксическую ошибку и не запускается. Есть ли способ сделать это, не перечисляя отдельные !содержит инструкции? т.е. это не то, что я ищу:

 | 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")
 

Это ничего не даст в наборе результатов. Итак, если вы действительно ищете «где поле не содержит никакого значения в наборе», то, насколько я знаю, вам нужно выписывать каждое из них по отдельности, нет такого ключевого слова, куда вы могли бы передать набор для этой функциональности. Если кто-нибудь знает такое ключевое слово, пожалуйста, дайте мне знать в комментариях или новом ответе, и я обновлю этот вопрос.

Ответ №1:

вы могли бы использовать 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"))
 

Комментарии:

1. Спасибо, Йони! Я ранее пробовал | where Position not(has_any("Manager", "Sales")) , что не сработало, но вы получили это синтаксическое волшебство

2. NOT IN operation также отлично работает! Employees | where not(Position in ("Coordinator"))