Język Q - zapytania funkcjonalne
Zapytania funkcjonalne (dynamiczne) pozwalają na określanie nazw kolumn jako symboli typowych kolumn Q-sql select / exec / delete. Jest to bardzo przydatne, gdy chcemy dynamicznie określać nazwy kolumn.
Formy funkcjonalne to -
?[t;c;b;a]    / for select
![t;c;b;a]    / for update 
    gdzie
t jest stołem;
a jest słownikiem agregatów;
bfraza oboczna; i
c to lista ograniczeń.
Uwaga -
Wszystko q podmioty w a, b, i c muszą być przywoływane przez nazwę, czyli jako symbole zawierające nazwy jednostek.
Składniowe formy wyboru i aktualizacji są analizowane do ich równoważnych form funkcjonalnych przez q tłumacza, więc nie ma różnicy w wydajności między tymi dwoma formami.
Funkcjonalny wybór
Poniższy blok kodu pokazuje, jak używać 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 
    Przykład 1
Zacznijmy od najłatwiejszego przypadku, funkcjonalnej wersji “select from t” będzie wyglądać jak -
q)?[t;();0b;()]     / select from t
    n      p
-----------------
   ibm    40
   msft   38
 samsung  45
  apple   54 
    Przykład 2
W poniższym przykładzie używamy funkcji enlist do tworzenia singletonów, aby upewnić się, że odpowiednie jednostki są listami.
q)wherecon: enlist (>;`p;40)
q)?[`t;wherecon;0b;()] / select from t where p > 40
    n      p
----------------
 samsung  45
  apple   54 
    Przykład 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 
    Funkcjonalny Exec
Funkcjonalna forma exec jest uproszczoną formą 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 
    Aktualizacja funkcjonalna
Funkcjonalna forma aktualizacji jest całkowicie analogiczna do tej z select. W poniższym przykładzie użycie enlist polega na utworzeniu singletonów, aby upewnić się, że jednostki wejściowe są listami.
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 
    Funkcjonalne usuwanie
Usuwanie funkcjonalne to uproszczona forma aktualizacji funkcjonalnej. Jego składnia jest następująca -
![t;c;0b;a]        / t is a table, c is a list of where constraints, a is a
                   / list of column names 
    Weźmy teraz przykład, aby pokazać, jak działa usuwanie funkcjonalne -
q)![t; enlist (=;`p; 40); 0b;`symbol$()]
                                          / delete from t where p = 40
   n       p
---------------
  msft    38
 samsung  45
  apple   54