Учебники

Q Language — Функциональные запросы

Функциональные (динамические) запросы позволяют указывать имена столбцов в виде символов для типичных столбцов 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

Давайте теперь возьмем пример, чтобы показать, как работает функциональное удаление —