首先,列是布爾向量,這樣你就可以在where
子句中使用「原始」:
q)tbl
red blue green yellow white purple
----------------------------------
0 0 1 0 0 0
1 0 1 1 0 0
1 0 1 1 1 0
0 0 0 0 0 0
0 1 0 0 1 1
1 0 1 1 0 0
q)select from tbl where red or green
red blue green yellow white purple
----------------------------------
0 0 1 0 0 0
1 0 1 1 0 0
1 0 1 1 1 0
1 0 1 1 0 0
您可以使用自己的函數中where
子句?絕對。
q)isRG:{or/[x`red`green]}
q)isRG tbl
111001b
q)select from tbl where isRG tbl
red blue green yellow white purple
----------------------------------
0 0 1 0 0 0
1 0 1 1 0 0
1 0 1 1 1 0
1 0 1 1 0 0
去超越你的問題,使列名參數的功能,而不是寫在Q-SQL where
子句中使用函數,使用functional select。在這裏,你將你的約束表達爲parse tree,例如, (or;`red;`white)
q)?[tbl; enlist(or; `red; `white); 0b;()]
red blue green yellow white purple
----------------------------------
1 0 1 1 0 0
1 0 1 1 1 0
0 1 0 0 1 1
1 0 1 1 0 0
然後,您可以參數化的列名:
q)selEither:{[t; c1; c2] ?[t; enlist(or; c1 ;c2); 0b;()]}
q)selEither[tbl; `red; `white]
red blue green yellow white purple
----------------------------------
1 0 1 1 0 0
1 0 1 1 1 0
0 1 0 0 1 1
1 0 1 1 0 0
最後,您可以從一對延長這一列名的列表:
q)selAny:{[tbl; cn] ?[tbl; enlist(or/;enlist,cn); 0b;()]}
q)selAny[t; `white`green`yellow]
…
查看更多在KX技術白皮書Parse Trees and Functional Forms
來源
2017-09-14 18:34:51
SJT
J確保評估布爾值或布爾值列表的權利。 – Chromozorz