kdb+中的条件控制语句
在kdb+中执行向量运算时,要尽量避免循环和条件执行语句,以获得干净、简洁、高性能的代码。然而有些时候,难以避免要编写循环,kdb+提供了一些常用的控制语句。本篇主要介绍kdb+中控制语句的用法。kdb+中基础条件语句的写法为:$[expr_cond;expr_true;expr_false] 其中expr_cond是返回布尔值的任意表达式,返回值非0则执行expr_true,返回值为0则执行expr_false。例如:$[expr_cond;[expr_true1;expr_true2;...];[expr_false1;expr_false2;...]]其中expr_cond是一个计算结果为布尔值的任意表达式。如果expr_cond返回值非零则执行大括号中的个语句序列(expr_true1;expr_true2;...),否则,执行第二个大括号语句序列(expr_false1;expr_false2;..)。q)$[test<>42;[a:6;b:7;a*b];[a:`Life;b:`the;c:`Universe;a,b,c]]$[expr_cond1;expr_true1; ... ;expr_condn;expr_truen;expr_false]在上述结构中,expr_condn将连续求值,直到执行expr_condi返回一个非0值,此时执行对应语句expr_truei,执行结束。如果没有一个表达式返回值为非0,则执行expr_false。q)$[a=0;`zero;a>0;`pos;`neg]注意,$[q;a;r;b;c]和$[q;a;$[r;b;c]]是等价的。[expr_cond1;[expr_true11;...];...; expr_condn;[exprtruen1;...];注意,应尽量避免使用这种结构复杂的控制语句,《q for mortals 3》一书作者认为这种代码是伪q:)。qSQL不支持$(cond )语句,要使用向量条件语句?,具体写法如下:?[vb; expr_true ; expr_false] 其中vb是一个元素为布尔值的简单数组。expr_ture和expr_flase类型相同,vb数组中元素值1b的位置返回expr_true,元素数值为0b的位置返回expr_false。vb、expr_true和expr_false必须是可匹配(conform)的,例如:q)?[11001b;3 8;10 20 30 40 50] / not conformq)?[11001b;1 2 3 4 5;10 20 30 40 50]如果expr_true或expr_false为原子型,则重复返回该值,例如:q)?[11001b;8;10 20 30 40 50]q)t:([] c1:1.1 2.2 3.3; c2:10 20 30; c3:100 200 300)q)update res:?[c1>2.0; c3; c2] from tif[expr_cond;expr1; ... ;exprn]当满足expr_cond时,从左到右依次执行expr1,…,exprn。好的q代码应避免使用if语句,if一般用在对函数进行参数检查。 if[count[y]<>3; '"length"]; q)if[b<>42;x:6;y:7;z:x*y] / 不返回值do[count;expr1;...;exprn]其中,count是一个非负的整数,代表执行次数,依次执行表达式expr1,expr2…直到达到指定的执行次数count。q)do[-1+f:r:n;r*:f-:1] / 一共做4次,f=f-1,r=r*fwhile[expr_cond;expr1; ... ; exprn]只要expr_cond不为0 ,则从左至右依次执行expr1,expr2...,直到expr_cond返回0为止。q)while[x-:1;r,:sum -2#r] /执行直到x=01 1 2 3 5 8 13 21 34 55 89注意,if、do和while是控制结构,不是函数,不返回值,也不能被迭代或投影。例如以下写法,用if语句,a并不能被成功赋值为42,要采用cond语句对a进行赋值。来源 https://www.modb.pro/db/212297