KDB:与表的字符串比较

KDB:与表的字符串比较,kdb,Kdb,我有一张桌子: bb:([]key1: 0 1 2 1 7; col1: 1 2 3 4 5; col2: 5 4 3 2 1; col3:("11";"22" ;"33" ;"44"; "55")) 如何对字符串进行关系比较?假设我要获取col3小于或等于“33”的记录 如果希望col3保持字符串类型,那么只需在qsql查询中临时强制转换即可 q)select from bb where ("J"$col3) <= 33 key1 col1 col2 col3 ------------

我有一张桌子:

bb:([]key1: 0 1 2 1 7; col1: 1 2 3 4 5; col2: 5 4 3 2 1; col3:("11";"22" ;"33" ;"44"; "55"))
如何对字符串进行关系比较?假设我要获取col3小于或等于“33”的记录


如果希望col3保持字符串类型,那么只需在qsql查询中临时强制转换即可

q)select from bb where ("J"$col3) <= 33
key1 col1 col2 col3
-------------------
0    1    5    "11"
1    2    4    "22"
2    3    3    "33"

q)从bb中选择,其中(“J”$col3)一种方法是在比较之前评估字符串:

q)bb:([]key1: 0 1 2 1 7; col1: 1 2 3 4 5; col2: 5 4 3 2 1; col3:("11";"22" ;"33" ;"44"; "55"))
q)bb
key1 col1 col2 col3
-------------------
0    1    5    "11"
1    2    4    "22"
2    3    3    "33"
1    4    2    "44"
7    5    1    "55"
q)
q)
q)select from bb where 33>=value each col3
key1 col1 col2 col3
-------------------
0    1    5    "11"
1    2    4    "22"
2    3    3    "33"

在本例中,value-each以整数形式返回字符串值,然后执行比较

如果您正在寻找经典字符串比较,无论字符串是否为数字,我将提出下一种方法:

a。创建行为类似于普通Java比较器的方法。当字符串相等时返回
0
,当第一个字符串小于第二个字符串时返回
-1
,当第一个字符串大于第二个字符串时返回
1

 .utils.compare: {$[x~y;0;$[x~first asc (x;y);-1;1]]};
 .utils.less: {-1=.utils.compare[x;y]};
 .utils.lessOrEq: {0>=.utils.compare[x;y]};
 .utils.greater: {1=.utils.compare[x;y]};
 .utils.greaterOrEq: {0<=.utils.compare[x;y]};
c。如下所示,这适用于任意字符串

cc:([]key1: 0 1 2 1 7; 
    col1: 1 2 3 4 5; 
    col2: 5 4 3 2 1; 
    col3:("abc" ;"def" ;"tyu"; "55poi"; "gab"));
select from cc where .utils.greaterOrEq["ffff"]'[col3]
.utils.compare
也可以用矢量形式编写,但我不确定它是否会更节省时间/内存

.utils.compareVector: {
    ?[x~'y;0;?[x~'first each asc each(enlist each x),'enlist each y;-1;1]]
 };

最好的答案是,对于较大的表,每个表的cast都比value快
bb:([]key1: 0 1 2 1 7; 
    col1: 1 2 3 4 5; 
    col2: 5 4 3 2 1; 
    col3:("11";"22" ;"33" ;"44"; "55"));
select from bb where .utils.greaterOrEq["33"]'[col3]
cc:([]key1: 0 1 2 1 7; 
    col1: 1 2 3 4 5; 
    col2: 5 4 3 2 1; 
    col3:("abc" ;"def" ;"tyu"; "55poi"; "gab"));
select from cc where .utils.greaterOrEq["ffff"]'[col3]
.utils.compareVector: {
    ?[x~'y;0;?[x~'first each asc each(enlist each x),'enlist each y;-1;1]]
 };