📅  最后修改于: 2020-11-03 06:55:18             🧑  作者: Mango
功能(动态)查询允许将列名称指定为典型q-sql select / exec / delete列的符号。当我们要动态指定列名时,它非常方便。
功能形式是-
?[t;c;b;a] / for select
![t;c;b;a] / for update
哪里
t是一张桌子;
a是聚合字典;
b副词;和
c是约束的列表。
a , b和c中的所有q实体必须按名称引用,即表示包含实体名称的符号。
q解释器将选择和更新的语法形式解析为它们的等效功能形式,因此两种形式之间没有性能差异。
以下代码块显示了如何使用功能选择–
q)t:([]n:`ibm`msft`samsung`apple;p:40 38 45 54)
q)t
n p
-------------------
ibm 40
msft 38
samsung 45
apple 54
q)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
让我们从最简单的情况开始, “ select from t”的功能版本如下所示:
q)?[t;();0b;()] / select from t
n p
-----------------
ibm 40
msft 38
samsung 45
apple 54
在下面的示例中,我们使用enlist函数创建单例,以确保适当的实体是列表。
q)wherecon: enlist (>;`p;40)
q)?[`t;wherecon;0b;()] / select from t where p > 40
n p
----------------
samsung 45
apple 54
q)groupby: enlist[`p] ! enlist `p
q)selcols: enlist [`n]!enlist `n
q)?[ `t;(); groupby;selcols] / select n by p from t
p | n
----- | -------
38 | msft
40 | ibm
45 | samsung
54 | apple
exec的功能形式是select的简化形式。
q)?[t;();();`n] / exec n from t (functional form of exec)
`ibm`msft`samsung`apple
q)?[t;();`n;`p] / exec p by n from t (functional exec)
apple | 54
ibm | 40
msft | 38
samsung | 45
update的功能形式与select的形式完全相似。在以下示例中,使用enlist的目的是创建单例,以确保输入实体为列表。
q)c:enlist (>;`p;0)
q)b: (enlist `n)!enlist `n
q)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