azure Kusto查询对标记名(键)而不是值进行不区分大小写的过滤

btxsgosb  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(155)

在我们的Azure环境中,有些资源包含的标签在使用大小写时命名不一致。假设我们有一个标签Projectteam。在我们的环境中,我们会有该标签名称的各种变体:

  • 项目组
  • 项目团队
  • 项目团队
  • 项目名称

你明白了,大写和小写拼写的使用可能到处都是。
我想要的是一个Kusto(KQL)查询,它以不区分大小写的方式过滤Projectteam标记。我发现了很多关于以不区分大小写的方式过滤标记的value的例子,但在这里我想对标记名称本身进行过滤。如果我使用这个查询:

Resources
| where tags.Projectteam == 'TeamX'

它只会返回标签名称与Projectteam完全匹配的资源,我不会得到任何使用不同大小写拼写的资源,比如projectTeam
当然,我可以对tags属性值应用一些过滤器,比如使用不区分大小写的contains操作符:

Resources
| where tags contains 'projectteam'

但是这也可能会返回不想要的结果,其中projectteam被用作值而不是标记名(键),而且感觉应该有更好的方法。
有没有人知道一种更好的方法来过滤标签名称不区分大小写?

zengzsys

zengzsys1#

Resources
| where tags has "ProjectTeam" and tags has "TeamX"
| where tags[tostring(bag_keys(tags)[array_index_of(parse_json(toupper(tostring(bag_keys(tags)))), toupper("ProjectTeam"))])] == "TeamX"

ADX上的演示:

let Resources = datatable(ID:long, tags:dynamic)
[
    1 ,dynamic({"dummy1": 1, "dummy2": 2, "Projectteam": "TeamX"})
   ,2 ,dynamic({"ProjectTeam": "TeamX"})
   ,3 ,dynamic({"projectTeam": "TeamX"})
   ,4 ,dynamic({"ProJeCtteAm": "TeamX"})
   ,5 ,dynamic({"ProjectTeam": "TeamY"})
   ,6 ,dynamic({"OtherTeam": "TeamX"})   
   ,7 ,dynamic({"OtherTeam": "TeamX", "ProjectTeam": "TeamY"})
];
Resources
| where tags has "ProjectTeam" and tags has "TeamX"
| where tags[tostring(bag_keys(tags)[array_index_of(parse_json(toupper(tostring(bag_keys(tags)))), toupper("ProjectTeam"))])] == "TeamX"

| 识别号|标签|
| - ------|- ------|
| 1个|{"虚拟人1 ":1,"虚拟人2 ":2,"项目团队":" TeamX "}|
| 第二章|{"项目团队":" TeamX "}|
| 三个|{"项目团队":" X团队"}|
| 四个|{"项目负责人":" X团队"}|
Fiddle

fivyi3re

fivyi3re2#

一种选择是使用bag_keys来提取标记密钥。

Resources
| extend keys = bag_keys(tags)
| where keys contains "ProJeCteAm"

使用bag_has_key可以更简单:

Resource
| where bag_has_key(tags, "ProJeCteAm")

相关问题