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