功能(动态)查询允许将列名指定为典型q-sql select/exec/delete列的符号.当我们想要动态指定列名时,它非常方便.
函数形式是 :
?[t;c;b;a] / for select![t;c;b;a] / for update
其中
t 是一张表;
a 是聚合字典;
b 按词组;和
c 是约束列表.
注意 :
a中的所有 q 实体, b 和 c 必须按名称引用,即含有实体名称的符号.
select和update的句法形式由 q 解释器解析为它们的等效函数形式,因此两种形式之间没有性能差异.
功能选择
以下代码块显示了如何使用功能选择 :
q)t:([]n:`ibm`msft`samsung`apple;p:40 38 45 54)q)t n p------------------- ibm 40 msft 38 samsung 45 apple 54q)select m:max p,s:sum p by name:n from t where p>36, n in `ibm`msft`apple name | m s------ | --------- apple | 54 54 ibm | 40 40 msft | 38 38
示例1
让我们从最简单的情况开始,的功能版本选择t"看起来像 :
q)?[t;();0b;()] / select from t n p----------------- ibm 40 msft 38 samsung 45 apple 54
示例2
在下面的示例中,我们使用enlist函数创建单例以确保适当的实体是列表.
q)wherecon: enlist (>;`p;40)q)?[`t;wherecon;0b;()] / select from t where p > 40 n p---------------- samsung 45 apple 54
示例3
q)groupby: enlist[`p] ! enlist `pq)selcols: enlist [`n]!enlist `nq)?[ `t;(); groupby;selcols] / select n by p from t p | n----- | ------- 38 | msft 40 | ibm 45 | samsung 54 | apple
Functional Exec
exec的功能形式是选择的简化形式.
q)?[t;();();`n] / exec n from t (functional form of exec)`ibm`msft`samsung`appleq)?[t;();`n;`p] / exec p by n from t (functional exec)apple | 54ibm | 40msft | 38samsung | 45
功能更新
更新的功能形式完全类似于选择.在下面的示例中,使用enlist是为了创建单例,以确保输入实体是列表.
q)c:enlist (>;`p;0)q)b: (enlist `n)!enlist `nq)a: (enlist `p) ! enlist (max;`p)q)![t;c;b;a] n p------------- ibm 40 msft 38 samsung 45 apple 54
功能删除
功能删除是功能更新的简化形式.其语法如下 :
![t;c;0b;a] / t is a table, c is a list of where constraints, a is a / list of column names
现在让我们举一个例子来说明功能删除的工作原理和减号;
q)![t; enlist (=;`p; 40); 0b;`symbol$()] / delete from t where p = 40 n p--------------- msft 38 samsung 45 apple 54