如何在Kdb Q中将myTable的CustomerName替换为原始名称
解决方案
步骤1:构建全局映射字典
先从Names表生成键值对映射,把所有需要替换的字符串(包括OriginalName里的变体、username字段)都关联到对应的最终显示名称。由于Names表最多仅20行,这种方式完全高效:
// 生成所有需要的键值对:OriginalName映射自身,username映射到对应行的OriginalName mapPairs: raze {[row] (row.OriginalName; row.OriginalName), (row.username; row.OriginalName)} each Names; // 转换为字典,自动处理重复键(示例中重复键的映射目标一致,无需额外处理) nameMap: `key`value!flip mapPairs;
验证字典内容(执行nameMap)会得到:
"Arnab ahmed" | "Arnab ahmed" "ancdv" | "Arnab ahmed" "ancdv4" | "Arnab ahmed" "Arnab ahmed (TY)" | "Arnab ahmed" "id001" | "Arnab ahmed"
步骤2:批量替换myTable字段
利用字典的索引功能,直接对myTable的CustomerName列做映射替换,不存在的键会保留原值(符合需求中"仅替换存在项"的要求):
// 更新CustomerName列 myTable: update CustomerName: nameMap[CustomerName] from myTable;
执行后查看myTable,即可得到需求中的结果:
CustomerName ------------ "Arnab ahmed" "Arnab ahmed" "Arnab ahmed" "Arnab ahmed"
简化写法(一步完成)
如果不需要单独保留映射字典,也可以把逻辑合并成一行:
myTable: update CustomerName: (raze {[r] (r.OriginalName;r.OriginalName),(r.username;r.OriginalName)} each Names)!(raze {[r] r.OriginalName,r.OriginalName} each Names) @' CustomerName from myTable;
补充说明
- 针对2000行的myTable,这种基于小字典的替换操作性能完全达标,不会有任何性能瓶颈。
- 如果Names表中出现同一键对应不同OriginalName的极端情况,字典会保留最后出现的映射值,可根据实际业务规则调整键值对生成逻辑。
内容的提问来源于stack exchange,提问作者Dhanuushri
相关产品推荐
相关产品推荐

