KDB中列表比较时=运算符未抛出错误的技术咨询
解答:kdb+中
=运算符的向量行为与SQL的差异 这其实是kdb+和传统SQL在运算符设计逻辑上的核心区别导致的,我来给你拆解清楚:
kdb+的
=是向量级逐元素匹配,而非仅支持标量比较
传统SQL里,=只能和单个值匹配,多值必须用IN,但kdb+是面向向量的数据库,运算符天生支持向量之间的逐元素操作。在你的例子中:t:([] s:`GOOG`APPL;d:2?.z.d ;t:2?.z.t)列
s是一个长度为2的向量,当你执行select from t where s=GOOGAPPL时,kdb+会将列s和右边的向量\GOOGAPPL进行逐元素相等检查,得到布尔向量1b 1b,where子句会筛选出所有布尔值为1b的行——也就是全部两行,所以看起来返回了“正确”结果。什么时候会报错?向量长度不匹配且非倍数关系时
你觉得本该报错的场景,其实只有当两边向量长度不同且不是倍数关系时才会触发。比如如果你的表有3行:t:([] s:`GOOG`APPL`MSFT;d:3?.z.d ;t:3?.z.t) q)select from t where s=`GOOG`APPL 'length / 这里才会抛出长度不匹配的错误因为kdb+无法将长度为2的向量循环广播到长度为3的列上(2不是3的倍数),这时候才会报错。
in和=的适用场景差异- 用
in是明确表达“检查列元素是否属于目标列表”的语义,不管列表和列的长度是否匹配,都会返回符合成员关系的行。比如上面3行的表,select from t where s inGOOGAPPL会返回前两行,不会报错。 - 用
=则是逐元素的位置匹配,只有当两边向量长度相同(或为倍数关系)时才能正常工作,语义是“第n行的列值是否等于目标列表的第n个元素”。
- 用
总结一下:你的例子中=能正常返回结果,是因为列向量和目标列表的长度完全一致,逐元素匹配刚好全中,这是kdb+向量运算符的正常行为,而非bug。如果要更清晰地表达“匹配列表中任意元素”的意图,推荐使用in运算符。
内容的提问来源于stack exchange,提问作者user9475848
相关产品推荐
相关产品推荐

