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