Kusto中判断列提取值是否为字典键并返回对应值的方法
Kusto实现字典键不存在时返回原编码的方法
实现原理
Kusto中访问dynamic类型字典的不存在键时,会直接返回null,不需要额外遍历键集合做存在性判断,基于这个特性即可快速实现需求分支:
- 从
Name字段提取两个下划线之间的位置编码 - 用提取到的编码查询字典获取友好名称
- 若查询结果为
null(即编码不在字典中),返回原始位置编码;否则返回匹配到的友好名称
标准iif条件写法(符合要求的条件判断语法)
Floor_Name字段的计算逻辑如下,这里用split(Name, "_")[1]提取两个下划线中间的编码段,比硬编码偏移量的substring写法通用性更强,不受前后段长度变化影响:
Floor_Name = iif( isnull(mydict[split(Name, "_")[1]]), // 判断字典中是否存在对应编码 tostring(split(Name, "_")[1]), // 不存在则返回原始编码 tostring(mydict[split(Name, "_")[1]]) // 存在则返回友好名称 )
如果需要保持原有substring的提取逻辑,把split(Name, "_")[1]替换为substring(Name, 3, 4)即可,判断逻辑完全一致。
完整可运行测试代码
代码中新增了FX_105F_F00测试样例,可以直接运行验证结果:
let data = datatable(Timestamp:datetime, Name:string, Value:int) [ datetime(2022-02-18 10:00:00 AM), "AX_100A_A00", 100, datetime(2022-02-18 10:01:00 AM), "BX_101B_B00", 200, datetime(2022-02-18 10:02:00 AM), "CX_102C_C00", 300, datetime(2022-02-18 10:03:00 AM), "DX_103D_D00", 400, datetime(2022-02-18 10:04:00 AM), "EX_104E_E00", 500, datetime(2022-02-18 10:05:00 AM), "FX_105F_F00", 600 ]; let mydict = dynamic( { "100A":"New York" ,"101B":"Geneva" ,"102C":"France" ,"103D":"US" ,"104E":"Canada" } ); data | summarize result = max(Value) by Floor_Name = iif( isnull(mydict[split(Name, "_")[1]]), tostring(split(Name, "_")[1]), tostring(mydict[split(Name, "_")[1]]) )
运行结果
| Floor_Name | result |
|---|---|
| New York | 100 |
| Geneva | 200 |
| France | 300 |
| US | 400 |
| Canada | 500 |
| 105F | 600 |
不在字典中的编码105F已按要求直接作为Floor_Name返回。
内容的提问来源于stack exchange,提问作者Noobie2021
相关产品推荐
相关产品推荐

