Q语言 - 功能查询(Functional Queries)

优质
小牛编辑
132浏览
2023-12-01

功能(动态)查询允许将列名指定为典型q-sql select/exec/delete列的符号。 当我们想要动态指定列名时,它非常方便。

功能形式是 -

?[t;c;b;a]   /for select
![t;c;b;a]   /for update

哪里

  • t是一张桌子;

  • a是聚合词典;

  • b短语; 和

  • c是约束列表。

注意 -

  • abca所有q实体必须通过名称引用,即包含实体名称的符号。

  • select解释器的句法形式由q解释器解析为它们的等效函数形式,因此两种形式之间没有性能差异。

功能选择

以下代码块显示了如何使用functional select -

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 (Example 1)

让我们从最简单的情况开始, “select from t”的功能版本看起来像 -

q)?[t;();0b;()]    /select from t
    n      p
-----------------
   ibm    40
   msft   38
 samsung  45
  apple   54

例子2 (Example 2)

在以下示例中,我们使用enlist函数创建单例以确保适当的实体是列表。

q)wherecon: enlist (>;`p;40)
q)?[`t;wherecon;0b;()]/select from t where p > 40
    n      p
----------------
 samsung  45
  apple   54

例子3 (Example 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