如何在Kdb+函数式select中使用字典值替换字段名?
解决Kdb+函数式查询中动态替换列名的问题
问题分析
你尝试用(@;d;enlistp)直接替换函数式查询中的sym符号失败,原因是Kdb+的函数式查询条件里,in操作的第二个参数需要的是列名符号,而(@;d;enlistp)是未被求值的语法树结构,Kdb+不会自动解析它,反而会把它当成无效的列名处理。
可行解决方案
方案1:预先求值列名再构建查询
先从字典中取出列名符号,再代入函数式查询:
d:(enlist `p)!enlist `sym; targetCol: d`p; // 得到`sym ?[tbl;enlist(in;targetCol;enlist `a`b`c);0b;()]
方案2:在查询中直接求值表达式
如果需要在查询结构内动态获取列名,可以用value函数对(@;d;enlistp)求值,得到列名符号后再传入:
d:(enlist `p)!enlist `sym; ?[tbl;enlist(in;value (@;`d;enlist`p);enlist `a`b`c);0b;()]
或者更简洁地直接使用字典索引(本质和方案1一致,只是把求值过程嵌入查询参数):
?[tbl;enlist(in;d`p;enlist `a`b`c);0b;()]
验证说明
两种方案最终都会生成正确的函数式查询结构,等价于你原本的?[tbl;enlist(in;sym;enlist abc);0b;()],同时实现了从字典d动态获取列名的需求。
内容的提问来源于stack exchange,提问作者Rezzy
相关产品推荐
相关产品推荐

