Q 語言 - 函式式查詢



函式式(動態)查詢允許將列名指定為符號,用於典型的 q-sql select/exec/delete 列。當我們想要動態指定列名時,它非常方便。

函式式形式為:

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

其中

  • t 是一個表格;

  • a 是一個聚合字典;

  • b 是 by-短語;以及

  • c 是一個約束列表。

注意:

  • abc 中的所有 q 實體都必須按名稱引用,即包含實體名稱的符號。

  • select 和 update 的語法形式由 q 直譯器解析為等效的函式式形式,因此兩種形式之間沒有效能差異。

函式式 select

以下程式碼塊顯示瞭如何使用 函式式 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

讓我們從最簡單的案例開始,“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

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

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

函式式 Delete

函式式 delete 是函式式 update 的簡化形式。其語法如下:

![t;c;0b;a]        / t is a table, c is a list of where constraints, a is a
                   / list of column names

現在讓我們舉一個例子來說明函式式 delete 如何工作:

q)![t; enlist (=;`p; 40); 0b;`symbol$()]
                                          / delete from t where p = 40
   n       p
---------------
  msft    38
 samsung  45
  apple   54
廣告