Q Language - Функциональные запросы
Функциональные (динамические) запросы позволяют указывать имена столбцов в виде символов для типичных столбцов q-sql select / exec / delete. Это очень удобно, когда мы хотим указывать имена столбцов динамически.
Функциональные формы -
?[t;c;b;a] / for select
![t;c;b;a] / for update
где
t это стол;
a словарь агрегатов;
bпо фразе; и
c это список ограничений.
Примечание -
Все q субъекты в a, b, и c должны указываться по имени, то есть как символы, содержащие имена сущностей.
Синтаксические формы select и update разбираются в их эквивалентные функциональные формы с помощью 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
Начнем с самого простого - функциональной версии “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
Функциональное обновление
Функциональная форма обновления полностью аналогична таковой у 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