Q 语言 - 函数式查询
功能(动态)查询允许将列名称指定为典型 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 实体必须按名称引用,即符号 包含实体名称。
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 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
示例 1
让我们从最简单的情况开始,"select from 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 `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
函数式更新
函数式更新的形式与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