如何动态构建HDB查询:支持byClause、selectCols、whereCols配置
实现动态构建HDB查询语句的
get_hdb_data函数 完整函数实现
get_hdb_data:{[args] // 提取参数并设置默认值 startDate: args[`startDate]; endDate: args[`endDate]; syms: args[`syms]; valid: args[`valid]; byCols: @[args; `byCols; ::; `]; // 默认不分组 selCols: @[args; `selCols; ::; `]; // 默认查询全列 // 构建WHERE筛选条件 whereCond: (); // 添加日期范围筛选(仅当起止日期都存在时) if[not null startDate; not null endDate; whereCond,:=(date; within; (startDate; endDate))]; // 添加sym筛选(仅当syms不是`时) if[syms ~/: `; whereCond,:=(sym; in; syms)]; // 添加is_active状态筛选 if[not null valid; whereCond,:=(is_active; =; valid)]; // 处理查询列:全列或指定列 selectCols: $[selCols ~ `; cols tab; selCols]; // 处理分组子句:无分组或按指定列分组 byClause: $[byCols ~ `; (); (byCols; ())]; // 执行函数式查询 ?[tab; whereCond; byClause; selectCols] }
功能说明
参数处理逻辑
- 可选参数
byCols/selCols默认值为`,分别代表「不分组」和「查询全列」 - 必填参数包含
startDate/endDate(日期范围)、syms(sym筛选规则)、valid(is_active状态)
WHERE条件动态生成
- 日期范围:仅当
startDate和endDate都非空时,添加date within (startDate; endDate)筛选 - Sym筛选:当传入的
syms不是时,添加sym in syms筛选;传入则跳过该条件(查询全量sym) - 状态筛选:根据
valid值添加is_active = valid筛选
列与分组处理
- 查询列:若
selCols为`,自动读取表的所有列;否则使用指定列列表 - 分组:若
byCols为`,不执行分组;否则按指定列列表分组(无聚合函数时直接返回分组后的数据)
执行方式
采用KDB+原生的函数式查询语法执行,比字符串拼接更安全,避免注入风险,同时保持查询性能。
测试用例
1. 筛选指定sym与状态
args1: (`startDate`endDate`syms`valid)!(.z.d-10; .z.d; `GOOGL`MSFT; 1b); get_hdb_data[args1];
等价于手动查询:
select from tab where date within (.z.d-10; .z.d), sym in `GOOGL`MSFT, is_active=1b
2. 全sym+单分组
args2: (`startDate`endDate`syms`valid`byCols)!(.z.d-10; .z.d; `; 1b; `sym); get_hdb_data[args2];
等价于手动查询:
select by sym from tab where date within (.z.d-10; .z.d), is_active=1b
3. 指定查询列+多列分组
args3: (`startDate`endDate`syms`valid`byCols`selCols)!(.z.d-10; .z.d; `; 1b; `date`sym`group_name_symbol; `sym`ranks); get_hdb_data[args3];
等价于手动查询:
select sym,ranks by date,sym,group_name_symbol from tab where date within (.z.d-10; .z.d), is_active=1b
内容的提问来源于stack exchange,提问作者BlackPearl
相关产品推荐
相关产品推荐

